我有一个包含多个连续字符序列的字符串,例如:
aaabbcccdddd
我想将其表示为:a3b2c3d4
到目前为止,我已经想出了这个:
#! /usr/bin/perl
$str = "aaabbcccdddd";
$str =~ s/(.)\1+/$1/g;
print $str."\n";
Output:
abcd
它将连续的字符存储在捕获缓冲区中并仅返回一个。但是,我想要一种方法来计算捕获缓冲区中的连续字符数,然后仅显示一个字符,后跟该计数,以便将输出显示为a3b2c3d4
代替abcd
.
上述正则表达式需要进行哪些修改?
这似乎需要替换命令上的“执行”选项,因此替换文本被视为 Perl 代码的片段:
$str =~ s/((.)\2+)/$2 . length($1)/ge;
Script
#!/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;
Output
abcd
abcdefgh
a3b2c3d4
a3b2c3d4ef2gh12
您能分解一下正则表达式来解释它是如何工作的吗?
我假设是匹配部件有问题,而不是替换部件。
原来的正则表达式是:
(.)\1+
这捕获单个字符(.)
其后是重复一次或多次的相同字符。
修改后的正则表达式是“相同的”,但也捕获了整个模式:
((.)\2+)
第一个左括号开始整体捕获;第二个左括号开始捕获单个字符。但是,现在是第二次捕获,所以\1
在原来的需要变成\2
在修订中。
由于搜索捕获整个重复字符字符串,因此替换可以轻松确定模式的长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)