我怎样才能对整个捕获组应用负向前视?
问题描述:
鉴于以下正则表达式和主题文本,为什么只有在指定捕获组的最后一个字符URL
的负面预览?我怎样才能对整个捕获组应用负向前视?
// Regex
(?<URL>(?<Protocol>\w+):\/\/(?<Domain>[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*)(?!'|"|(</a))
// Subject text
<p><a href="http://example.com">http://example.com</a> and http://example.com</p>
此正则表达式具有负先行(?!"|(</a))
这是一个尝试不匹配是一个0标签内的网址。这是通过检查URL是否后跟一个报价('
或"
)或关闭</a
标签来完成的。
我得到的结果如下
http://example.co
http://example.co
http://example.com
我预期的负向先行应用于整个拍摄组,不只是它的最后一个字符。这可能吗?我究竟做错了什么?我预计只匹配http://example.com
的最后一个实例。
答
因为当负向预测失败时,量词(和其他任何可能的)将会回溯,直到找到匹配。
可以强制一个表达式不使用atomic groups(?>expression)
原路返回:
(?<URL>(?>(?<Protocol>\w+):\/\/(?<Domain>[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*))(?!'|"|(</a))