我有这样的文字
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*::)
这是我尝试过的,但失败了。看看正则表达式调试,它也是由于回溯。但是如何正确地做到这一点?
答案 0 :(得分:7)
您需要将\s*
放入前瞻:
real(?!\s*::)
请参阅regex demo
real\s*(?!::)
匹配real
,因为real
匹配real
,然后\s*
匹配0个或更多个空格,那么前瞻会使匹配失败::
和引擎回溯,也就是说,它会释放与\s*
匹配的空间并尝试重新匹配字符串。由于\s*
可以匹配空字符串,因此real
之前的:: b
会匹配。
见regex debugger scheme at regex101显示幕后发生的事情: