我需要使用regexp处理字符串,如果是数字则更改x-> y。
字符串:2x2x2 2x 2x2x 2x2x2x2x2
正则表达式:s/([0-9])x([0-9])/$1y$2/g
my $string = "2x2x2 2x 2x2x 2x2x2x2x2";
$string =~ s/([0-9])x([0-9])/$1y$2/g;
print "$string\n";
我希望:2y2y2 xx 2x 2y2x 2y2y2y2y2
但结果:2y2x2 2x 2y2x 2y2x2y2x2
(并非所有2x2都改变了)
我该怎么办?
答案 0 :(得分:8)
尝试以下正则表达式:
s/(?<=\d)x(?=\d)/y/g
答案 1 :(得分:2)
要明确:"2x2x2"
变为"2y2x2"
的原因是您的表达式首先与"2x2"
匹配,将其替换为"2y2"
,然后在<<}后继续搜索 / em>找到了那场比赛。下一位是"x2"
,与您的模式不匹配。
@ xdazz解决方案的工作原理是,环视断言实际上并不消耗字符串的字符。字符串中匹配的部分只是"x"
,只要前后跟数字。
顺便提一下,@ xdazz从[0-9]
到\d
的变化并没有太大变化,但它略有不同:\d
也会匹配被视为数字的其他Unicode字符,而{ {1}}仅匹配给定范围内的确切10个字符。