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

标签 regex perl

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

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/

相关文章:

java正则表达式插入字符作为特定索引位置

ruby - 在 Ruby 中将 Unicode 数字转换为整数

node.js - nodejs正则表达式杀死进程

regex - 正则表达式是否尝试匹配文本中字符之间的位置?

Perl:使重复哈希键的声明成为 fatal error ?

java - 在Java中使用正则表达式

regex - 正则表达式从命令历史记录中获取已执行的脚本名称

python - 检测和更改 PDF 中的字符串

perl - 在实用程序类中登录

正则表达式,仅包含 1 个字符的 grep 行