我有一个像XXXXYYYYZZZYYZZZYYYY
这样的字符串需要转换为XXXXAAAYZZZAYZZZAAAY
$s =~ s/Y{2}+/AY/g;
这有两个问题,{2}+
将获得YYYY到AYAY;和AY的长度不一样YYYY
(期待AAAY
)
如何在perl中完成这项工作?
总有不止一种方法可以做到这一点。我的建议是抓住除最后一个之外的所有Y,然后用它来创建一个相同长度的As字符串。 e
修饰符告诉perl在替换方执行代码而不是直接使用它,而r
修饰符告诉=~
返回替换结果而不是直接修改输入文本(对于这些单行测试很有用)地方)。
$ perl -E 'say shift =~ s/(Y+)(?=Y)/"A"x length$1/gre' XXXXYYYYZZZYYZZZYYYY
XXXXAAAYZZZAYZZZAAAY
$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'