我有一个包含多个连续字符序列的字符串,例如:
aaabbcccdddd
我想将其表示为:
a3b2c3d4
到目前为止,我想出了这个:
#! /usr/bin/perl
$str = "aaabbcccdddd";
$str =~ s/(.)\1+/$1/g;
print $str."\n";
输出:
abcd
它将连续字符存储在捕获缓冲区中并仅返回一个。但是,我想要一种方法来计算捕获缓冲区中连续字符的数量,然后只显示一个字符,后跟该计数,以便将输出显示为
a3b2c3d4
而不是 abcd
.上面的正则表达式需要什么修改?
最佳答案
这似乎需要替换命令上的“执行”选项,因此替换文本被视为 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
Could you please break down the regular expression to explain how it works?
我假设是匹配部分有问题,而不是替换部分。
原始正则表达式是:
(.)\1+
这将捕获单个字符
(.)
后跟重复一次或多次的相同字符。修改后的正则表达式“相同”,但也捕获了整个模式:
((.)\2+)
第一个左括号开始整体捕获;第二个左括号开始捕获单个字符。但是,现在是第二次捕获,所以
\1
在原来的需求变成\2
在修订。由于搜索捕获了整个重复字符的字符串,因此替换可以轻松确定模式的长度。
关于regex - 使用 Perl 计算字符串中的连续字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969251/