鉴于以下正则表达式和主题文本,为什么否定前瞻仅应用于命名捕获组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
的最后一个实例。
答案 0 :(得分:2)
因为当负向前瞻失败时,量词(以及其他任何可能)会回溯,直到找到匹配为止。
您可以使用atomic groups (?>expression)
强制表达式不回溯:
(?<URL>(?>(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*))(?!'|"|(</a))