3

给定以下正则表达式和主题文本,为什么负前瞻仅适用于命名捕获组的最后一个字符URL

// Regex
(?<URL>(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)(?!'|"|(</a))

// Subject text
<p><a href="http://example.com">http://example.com</a> and http://example.com</p>

这个正则表达式有一个否定的前瞻(?!"|(</a)),它试图不匹配<a>标签内的 URL。这是通过检查 URL 是否后跟引号 ('") 或结束</a标记来完成的。

我得到以下结果

http://example.co  
http://example.co  
http://example.com

我预计负前瞻适用于整个捕获组,而不仅仅是最后一个字符。这可能吗?我究竟做错了什么?我希望只匹配http://example.com要捕获的最后一个实例。

4

1 回答 1

3

因为当负前瞻失败时,量词(以及任何其他可能的)将回溯,直到找到匹配项。

您可以使用原子组 强制表达式不回溯(?>expression)

(?<URL>(?>(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*))(?!'|"|(</a))
于 2013-03-08T15:56:38.103 回答