2016-07-25 86 views
2

我有这样正则表达式:为什么这个负向预测不起作用?

real:: a 
real :: b 
real c 

文字,现在我要匹配的那些真正的无::其次,在这种情况下,我想只匹配第三实。所以我试图用正则表达式前瞻

real\s*(?!::) 

但这匹配

real :: b 
real c 

对于\s*意味着零个或多个\s,为什么real :: b被匹配?

更新

感谢Wiktor的Stribiżew。使用regex101调试工具。我们可以发现backtrack使事情变得复杂。

我想出了另一个任务类似,但我解决不了

real (xx(yy)) :: a 
real (zz(pp)):: b 
real (cc(rr)) c 

再次,我想匹配real (cc(rr))这是没有::以下。

real\s*\(.*?\)+(?!\s*::) 

这是我试过的,但失败了。看看正则表达式调试,这也是由于回溯。但如何正确地做到这一点?

回答

5

你需要把\s*进入前瞻:

real(?!\s*::) 

regex demo

real\s*(?!::)比赛real因为real比赛real,那么\s*匹配0个或多个空格,然后先行在::和发动机回路上的比赛失败,也就是说,它释放了与匹配的空间并尝试重新匹配字符串。由于\s*可以匹配空字符串,因此:: b之前的real得到匹配。

regex debugger scheme at regex101显示是怎么回事幕后:

enter image description here

+0

好吧,不过你能解释一下为什么我的正则表达式失败? – user15964

+0

我添加了解释,为什么在lookahead之外的'\ s *'与第二种情况相匹配,并添加了regex101中的图表来说明这个过程。 –

+0

@ user15964该断言是一个“否定性超前断言”。这意味着它声称内容不会立即出现在放置位置之后。 –

相关问题