我有一个包含多个连续字符序列的字符串,例如:
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
修订版.
因为搜索捕获整个重复字符串,所以替换可以容易地确定模式的长度.
归档时间: |
|
查看次数: |
3282 次 |
最近记录: |