我有这样的文字
real:: a
real :: b
real c
现在我想匹配那些没有
::
的真实其次,在这种情况下,我只想匹配第 3 个实数。所以我用前瞻尝试了正则表达式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*::)
这是我尝试过的,但失败了。查看正则表达式调试,这也是由于回溯。但是如何正确地做到这一点?
最佳答案
你需要把\s*
进入前瞻:
real(?!\s*::)
见 regex demo
real\s*(?!::)
匹配 real
因为real
匹配 real
,然后是 \s*
匹配 0 个或多个空格,则前瞻在 ::
处匹配失败并且引擎回溯 ,即释放与\s*
匹配的空间并尝试重新匹配字符串。自 \s*
可以匹配空字符串,real
之前 :: b
匹配。见 regex debugger scheme at regex101显示幕后发生的事情:
关于正则表达式:为什么这种负面的前瞻不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38573177/