我有一个非常简单的替代:
my $s = "<a>test</a> <a>test</a>";
$s =~ s{ <a> .+? </a> $ }{WHAT}x;
print "$s\n";
打印:
WHAT
但我在期待:
<a>test</a> WHAT
与ungreedy选项交互时,我对“结束字符串锚”有什么误解?
所以,我对regexp引擎错了。实际上,不要将代码人性化 - 它正确地做了你所写的,而不是你“认为做”。
首先找到<a>
,然后找</a>$
。第一次锁定是正面的,模式匹配。
正确的模式必须是:
$s =~ s{ <a> (?! .* <a> ) .* </a> }{WHAT}x;
多数民众赞成正确地给我
<a>test</a> WHAT
因为现在我真的问regexp 最后 <a>
。
我认为效率较低[^<]+
,但更灵活。
答案 0 :(得分:5)
答案 1 :(得分:4)
非贪婪修饰符(以及一般的正则表达式)从左到右工作,所以本质上发生的是它试图找到在第一个<a>
之后匹配的最短字符串,直到位于字符串末尾的下一个</a>
。
这可以达到您的期望:
my $s="<a>test</a> <a>test</a>";
$s =~ s#<a>[^<>]+</a>$#WHAT#;
print "$s\n";
你想解决的问题是什么?