关于perl regexp的奇怪结果 - 结束字符串锚点并且立刻不同意

Mee*_*tya 0 regex perl

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

my $s = "<a>test</a> <a>test</a>";
$s =~ s{ <a> .+? </a> $ }{WHAT}x;

print "$s\n";
Run Code Online (Sandbox Code Playgroud)

打印:

WHAT
Run Code Online (Sandbox Code Playgroud)

但我期待:

<a>test</a> WHAT
Run Code Online (Sandbox Code Playgroud)

在与ungreedy选项交互时,我对"结束字符串锚"有什么误解?


所以,我对regexp引擎错了.实际上,不要将代码人性化 - 它正确地做了你写的,而不是你" 想做 ".

它首先找到<a>,然后找到</a>$.第一次锁定为正,模式匹配.

正确的模式必须是:

$s =~ s{ <a> (?! .* <a> ) .* </a> }{WHAT}x;
Run Code Online (Sandbox Code Playgroud)

多数民众赞成给我正确的

<a>test</a> WHAT
Run Code Online (Sandbox Code Playgroud)

因为现在我真的问正则表达式的最后 <a>.

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

Cha*_*ens 5

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