2

以 perl v5.22.0 中的这个简单示例为例:

my $data = "foobar\n";
$data =~ s/(?<!bar)(\s*)$/qux$1/;
print $data;

它打印:

foobar
qux

但我没想到$data会改变。我还尝试了一些早期版本的 perl 5.x,结果相同。

相反,我希望这个具有相同正则表达式的字符串会导致替换,但它不会:

my $data = "foobaz\n";
$data =~ s/(?<!bar)(\s*)$/qux$1/;
print $data;


我不明白为什么会这样。在任何一个中,星号都应该是贪婪的。我认为$1将在第一个示例和第二个示例中\n进行负面的后视组比较。当我使用 perl 时,Regex101 说:barbaz

量词:* 在零次和无限次之间,尽可能多次,根据需要回馈。

那么在这种情况下会发生什么是它回馈消极的后视?

正如标题所说,真正的问题是我想阻止后视者吞下第二组。不幸的是,它不是一个字母,这只是为了让示例更容易理解。同样在 perl 中,我对负面后视可以做的事情有些限制,例如“可变长度后视未在正则表达式中实现”。如果可能的话,我想要一个与 perl 5.8 兼容的答案。谢谢

4

2 回答 2

2

它真的匹配最后一个位置,在位置之前\n和之后$,现在看看你的正则表达式:

(?<!bar)(\s*)$

在位置不是bar:matched之前

位置$匹配后(\s*)$

于 2015-09-08T03:23:40.483 回答
2
于 2015-09-08T03:23:48.953 回答