这似乎需要替换命令上的“执行”选项,因此替换文本被视为 Perl 代码的片段:
$str =~ s/((.)\2+)/$2 . length($1)/ge;
脚本
#!/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;
输出
abcd
abcdefgh
a3b2c3d4
a3b2c3d4ef2gh12
你能分解正则表达式来解释它是如何工作的吗?
我假设有问题的是匹配部分而不是替换部分。
原来的正则表达式是:
(.)\1+
这将捕获单个字符,该字符(.)
后跟重复一次或多次的相同字符。
修改后的正则表达式是“相同的”,但也捕获了整个模式:
((.)\2+)
第一个左括号开始整体捕获;第二个左括号开始捕获单个字符。但是,现在是第二次捕获,所以\1
原版中的需要成为\2
修改版中的。
因为搜索捕获了整个重复字符的字符串,所以替换可以很容易地确定模式的长度。