为什么这个后顾断言在被锚定到字符串前面时不起作用?运行以下代码,你会发现第一个测试通过了,但是第二个测试只有一个变化,即
^
锚点,却失败了。use Test::More tests => 2;
my $s = '/123/456/hello';
$s =~ s{(?<=/)\d+(?=/\d+/hello)}{0}; # unanchored
is($s, '/0/456/hello', 'unanchored'); # passes
$s = '/123/456/hello';
$s =~ s{^(?<=/)\d+(?=/\d+/hello)}{0}; # anchored
is($s, '/0/456/hello', 'anchored'); # fails
对于我来说,把^
放到向后查找断言中不是一个选项(这只是一个极为简化的例子),但这确实解决了问题。我已经找到了另一种实现我想要的功能的方法,但我很好奇为什么这种方法行不通。我已经在Perl 5.8.8和Perl 5.10.0上进行了测试。
\d+
之前查找,而不是在^
之前。它不匹配,因为该断言不会消耗其匹配的字符,这样在应用断言后的“有效正则表达式”就变成了^\d+
,当然无法匹配/123/456/hello
。 - John Siracusa