如何在Perl中替换连续和相同的字符?

问题描述 投票:3回答:3

我有一个像XXXXYYYYZZZYYZZZYYYY这样的字符串需要转换为XXXXAAAYZZZAYZZZAAAY

$s =~ s/Y{2}+/AY/g;

这有两个问题,{2}+将获得YYYY到AYAY;和AY的长度不一样YYYY(期待AAAY

如何在perl中完成这项工作?

regex string perl replace
3个回答
6
投票

使用“预见”:

$s =~ s/Y(?=Y+)/A/g;

(?=Y+)的意思是“后跟一个或多个Y字符”,所以任何Y字符后跟另一个Y字符将被替换为A

More info from perlretut


4
投票

总有不止一种方法可以做到这一点。我的建议是抓住除最后一个之外的所有Y,然后用它来创建一个相同长度的As字符串。 e修饰符告诉perl在替换方执行代码而不是直接使用它,而r修饰符告诉=~返回替换结果而不是直接修改输入文本(对于这些单行测试很有用)地方)。

$ perl -E 'say shift =~ s/(Y+)(?=Y)/"A"x length$1/gre' XXXXYYYYZZZYYZZZYYYY
XXXXAAAYZZZAYZZZAAAY

0
投票

$s =~ s/Y{2}+/AY/g RHS模式是模糊的模糊模式:Y{2}+,这是很少使用的正则表达式模式,除非{}+很少在少数高级正则表达式引擎中可用,包括perl可能,作为称为“原子分组”的正则表达式特征。 你可能意味着(Y{2})+ which is (YY)+Y{2,}YY+ 在perl中,它简直易用,因为它支持lookaround功能

perl -e '$s=XXXXYYYYZZZYYZZZYYYY ;$s =~ s/Y(?=Y)/A/g;print $s'

实际上较低的正则表达式引擎这样的sed仍然可以做到这一点,虽然是繁琐,不安的方式

echo XXXXYYYYZZZYYZZZYYYY |sed -E 's/YY+/&\n/g;s/Y/A/g;s/A\n/Y/g'
© www.soinside.com 2019 - 2024. All rights reserved.