2013-03-08 17 views
2

鉴于以下正则表达式和主题文本,为什么只有在指定捕获组的最后一个字符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的最后一个实例。

回答

2

因为当负向预测失败时,量词(和其他任何可能的)将会回溯,直到找到匹配。

可以强制一个表达式不使用atomic groups(?>expression)原路返回:

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