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

标签 regex

我有这样的文字

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显示幕后发生的事情:

enter image description here

关于正则表达式:为什么这种负面的前瞻不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38573177/

相关文章:

python - 使用 BS4 从网页中提取多个不带 'a' 或 'href' 标签的 URL

javascript - 我需要一个正则表达式来删除开头的空格,并且它应该允许两个单词之间有空格

php - preg_replace 在 IMG 标签中提出斜杠

javascript - 获取某些 CSS 属性的所有类名

regex - 编写选择 VBScript 类及其名称的正则表达式

php - 如何在 preg_replace 中用 c(xxx) 替换 c(xxx)?

regex - 具有正则表达式循环值的 shell 脚本输入字符串

python - 在数据帧上使用 python 进行快速文本处理

java - 如何在正则表达式中分组

java - 正则表达式匹配模式并排除字符串的一部分