如何对整个捕获组应用负向前瞻?

时间:2013-03-08 15:46:00

标签: .net regex lookahead regex-lookarounds negative-lookahead

鉴于以下正则表达式和主题文本,为什么否定前瞻仅应用于命名捕获组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>标记内的网址。这是通过检查网址后面是引号('")还是结束</a标记来完成的。

我收到了以下结果

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

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

1 个答案:

答案 0 :(得分:2)

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

您可以使用atomic groups (?>expression)强制表达式不回溯:

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