perl正则表达式的奇怪结果 - 结束字符串锚和&不合时宜的

时间:2010-08-10 16:28:25

标签: regex perl

我有一个非常简单的替代:

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>

我认为效率较低[^<]+,但更灵活。

2 个答案:

答案 0 :(得分:5)

这是您不使用正则表达式匹配HTML的原因之一。尝试使用解析器。请参阅此question及其答案,了解更多原因,不使用正则表达式,以及此问题及其answers,了解如何使用HTML解析器。

答案 1 :(得分:4)

非贪婪修饰符(以及一般的正则表达式)从左到右工作,所以本质上发生的是它试图找到在第一个<a>之后匹配的最短字符串,直到位于字符串末尾的下一个</a>

这可以达到您的期望:

my $s="<a>test</a> <a>test</a>";
$s =~ s#<a>[^<>]+</a>$#WHAT#;

print "$s\n";

你想解决的问题是什么?