我正在尝试使用以下正则表达式替换一组带有前后空格的模式
s/ $pattern / replacement /g
但它只转换一行($pattern $pattern => replacement $pattern
)
我尝试了s/(? $pattern )/ replacement /g
但这也行不通。加$pattern
由较小的图案组成,当较大的图案已经存在时,我不想替换它们。
实施例:
在替换之前,字符串包含ab ab
。之后
s/ ab / alphabeta /
我得到alphabeta ab
答案 0 :(得分:4)
在第一次替换中,模式之间的空格是匹配字符串的一部分,因此下一个匹配在空格后开始。您可以使用零宽度前瞻断言使位置不在空间上前进:
my $s = ' a a a a a ';
$s =~ s/ a(?= )/ X /g;
print $s;
输出:
X X X X X
答案 1 :(得分: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