正则表达式:为什么这种负面的前瞻不起作用?

时间:2016-07-25 16:36:44

标签: regex

我有这样的文字

real:: a
real :: b
real c

现在我想匹配那些没有::的真实,在这种情况下,我想只匹配第3个真实。所以我尝试使用lookahead

进行正则表达式
real\s*(?!::)

但是匹配

real :: b
real c

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

更新

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

我想出了另一个类似的但我无法解决的任务

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

再次,我希望匹配real (cc(rr))之后没有::的内容。

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

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

1 个答案:

答案 0 :(得分:7)

您需要将\s*放入前瞻:

real(?!\s*::)

请参阅regex demo

real\s*(?!::)匹配real,因为real匹配real,然后\s*匹配0个或更多个空格,那么前瞻会使匹配失败:: 和引擎回溯,也就是说,它会释放与\s*匹配的空间并尝试重新匹配字符串。由于\s*可以匹配空字符串,因此real之前的:: b会匹配。

regex debugger scheme at regex101显示幕后发生的事情:

enter image description here