我有这样的文本
但这个匹配。
"
这是我尝试过的方法,但失败了。请查看正则表达式调试,这也是由于回溯引起的。但如何正确地做到这一点?
real:: a
real :: b
real c
现在我想匹配那些没有跟随::
的实际内容,而在这种情况下,我只想匹配第三个实际内容。因此,我尝试使用具有前瞻性的正则表达式。
real\s*(?!::)
但这个匹配。
real :: b
real c
"
对于\s*
表示零个或多个\s
,为什么会匹配real :: b
?
更新:
感谢Wiktor Stribiżew。使用regex101调试工具,我们可以发现回溯使事情变得复杂。
我提出了另一个类似的任务,但是我无法解决它。
"real (xx(yy)) :: a
real (zz(pp)):: b
real (cc(rr)) c
再次强调,我希望匹配不包含::
的real (cc(rr))
。
real\s*\(.*?\)+(?!\s*::)
这是我尝试过的方法,但失败了。请查看正则表达式调试,这也是由于回溯引起的。但如何正确地做到这一点?
\s*
匹配第二种情况,并添加了来自regex101的图表,说明了这个过程。 - Wiktor Stribiżewreal(?!.*?::)
。你必须允许在前瞻中的::
之前有0个或多个字符,否则回溯仍然会使匹配不必要的real
成为可能。 - Wiktor Stribiżew