gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:42:18 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com