以 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 说:bar
baz
量词:* 在零次和无限次之间,尽可能多次,根据需要回馈。
那么在这种情况下会发生什么是它回馈消极的后视?
正如标题所说,真正的问题是我想阻止后视者吞下第二组。不幸的是,它不是一个字母,这只是为了让示例更容易理解。同样在 perl 中,我对负面后视可以做的事情有些限制,例如“可变长度后视未在正则表达式中实现”。如果可能的话,我想要一个与 perl 5.8 兼容的答案。谢谢