Perl的。 Regexp只工作一次

时间:2012-10-06 07:22:22

标签: regex perl

我需要使用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都改变了)

我该怎么办?

2 个答案:

答案 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个字符。