Perl匹配具有条件的重叠序列

时间:2013-11-06 15:44:34

标签: regex perl

我正在尝试使用以下正则表达式替换一组带有前后空格的模式

s/ $pattern / replacement /g

但它只转换一行($pattern $pattern => replacement $pattern

中的两个模式中的第一个

我尝试了s/(? $pattern )/ replacement /g

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

实施例: 在替换之前,字符串包含ab ab。之后

s/ ab / alphabeta /

我得到alphabeta ab

2 个答案:

答案 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