0

我正在尝试使用以下正则表达式在它们之前和之后用空格替换一组模式

s/ $pattern / replacement /g

但它只转换一行中两个模式中的第一个 ( $pattern $pattern => replacement $pattern)

我试过s/(? $pattern )/ replacement /g

但这也行不通。Plus$pattern由较小的模式组成,当较大的模式已经存在时,我不想替换它们。

示例:在替换之前,字符串包含ab ab. 后

s/ ab / alphabeta /

我明白了alphabeta ab

4

2 回答 2

4

在第一次替换中,模式之间的空格是匹配字符串的一部分,因此下一次匹配在空格之后开始。您可以使用零宽度前瞻断言来使位置不超过空间:

my $s = ' a a a a a ';
$s =~ s/ a(?= )/ X /g;
print $s;

输出:

 X  X  X  X  X
于 2013-11-06T15:53:18.297 回答
3
$_ = " foo foo foo ";
s/ foo / bar /g;
say; # " bar foo bar "

这里的问题是,当第一次foo匹配时,它会占用它周围的空格,所以当下一次匹配继续时,在下一个匹配之前没有前导空间可以匹配foo

为了解决这个问题,您可以使用环视,这样您就不会占用空间。例如:

s/(?<= )foo(?= )/bar/g;
say; # " bar bar bar "

或者在你的情况下:

s/(?<= )$pattern(?= )/replacement/g
于 2013-11-06T15:53:27.227 回答