6

我需要用正则表达式处理字符串,如果是数字,则更改 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 都改变了)

我该怎么办?

4

2 回答 2

8

试试下面的正则表达式:

s/(?<=\d)x(?=\d)/y/g
于 2012-10-06T07:28:05.217 回答
2

明确地说:原因是您的表达式首先匹配,"2x2x2"将其替换为,然后在找到该匹配项继续搜索。下一位是,它与您的模式不匹配。"2y2x2""2x2""2y2""x2"

@xdazz 的解决方案有效的原因是环视断言实际上并不消耗字符串的字符。字符串中匹配的部分只是"x", 前后都是数字。

顺便说一句,@xdazz 从[0-9]to的变化\d并没有太大变化,但略有不同:\d还将匹配其他被视为数字的 Unicode 字符,而[0-9]仅匹配给定范围内的确切 10 个字符。

于 2012-10-08T15:22:23.017 回答