使用Perl计算字符串中的连续字符数

Neo*_*ash 6 regex perl

我有一个包含多个连续字符序列的字符串,例如:

aaabbcccdddd
Run Code Online (Sandbox Code Playgroud)

我想把它表示为: a3b2c3d4

截至目前,我已经想出了这个:

#! /usr/bin/perl

$str = "aaabbcccdddd";
$str =~ s/(.)\1+/$1/g;

print $str."\n";
Run Code Online (Sandbox Code Playgroud)

输出:

abcd
Run Code Online (Sandbox Code Playgroud)

它将连续字符存储在捕获缓冲区中,并仅返回一个.但是,我想要一种方法来计算捕获缓冲区中连续字符的数量,然后只显示一个字符,后跟该计数,以便它显示输出a3b2c3d4而不是abcd.

上述正则表达式需要进行哪些修改?

Jon*_*ler 10

这似乎需要在substitute命令上使用'execute'选项,因此替换文本被视为Perl代码的片段:

 $str =~ s/((.)\2+)/$2 . length($1)/ge;
Run Code Online (Sandbox Code Playgroud)

脚本

#!/usr/bin/env perl
use strict;
use warnings;

my $original = "aaabbcccdddd";
my $alternative = "aaabbcccddddeffghhhhhhhhhhhh";

sub proc1
{
    my($str) = @_;
    $str =~ s/(.)\1+/$1/g;
    print "$str\n";
}

proc1 $original;
proc1 $alternative;

sub proc2
{
    my($str) = @_;
    $str =~ s/((.)\2+)/$2 . length($1)/ge;
    print "$str\n";
}

proc2 $original;
proc2 $alternative;
Run Code Online (Sandbox Code Playgroud)

产量

abcd
abcdefgh
a3b2c3d4
a3b2c3d4ef2gh12
Run Code Online (Sandbox Code Playgroud)

你能否打破正则表达式来解释它是如何工作的?

我假设它是匹配部分是有问题的而不是替换部分.

原始的正则表达式是:

(.)\1+
Run Code Online (Sandbox Code Playgroud)

这会捕获单个字符(.),后面跟着相同的字符重复一次或多次.

修订后的正则表达式"相同",但也捕获了整个模式:

((.)\2+)
Run Code Online (Sandbox Code Playgroud)

第一个开括号开始整体捕获; 第二个左括号开始捕获单个字符.但是,它现在是第二次捕获,所以\1原来需要成为\2修订版.

因为搜索捕获整个重复字符串,所以替换可以容易地确定模式的长度.