理解消极的先行

St.*_*rio 38 regex regex-lookarounds

我试图理解负面的前瞻是如何在简单的例子上起作用的.例如,考虑以下正则表达式:

a(?!b)c
Run Code Online (Sandbox Code Playgroud)

我认为负面前瞻符合一个位置.因此,在这种情况下,正则表达式匹配任何严格包含3个字符的字符串,而不是abc.

但这不是真的,正如在这个演示中可以看到的那样.为什么?

nu1*_*73R 46

Lookaheads不消耗任何字符.它只是检查前瞻是否可以匹配:

a(?!b)c
Run Code Online (Sandbox Code Playgroud)

所以在匹配之后a,只检查它是否遵循不是b但不消耗该not字符(即c),然后是c.

怎么a(?!b)c匹配ac

ac
|
a

ac
 |
(?!b) #checks but does not consume. Pointer remains at c

ac
 |
 c
Run Code Online (Sandbox Code Playgroud)

积极的向前看

积极的前瞻是类似的,因为它试图匹配前瞻中的模式.如果它可以匹配,那么正则表达式引擎继续匹配模式的其余部分.如果不能,则丢弃该匹配.

例如

abc(?=123)\d+ 匹配 abc123

abc123
|
a

abc123
 |
 b

abc123
  c

abc123 #Tries to match 123; since is successful, the pointer remains at c
    |
 (?=123)

abc123 # Match is success. Further matching of patterns (if any) would proceed from this position
  |

abc123
   |
  \d

abc123
    |
   \d

abc123 #Reaches the end of input. The pattern is matched completely. Returns a successfull match by the regex engine
     |
    \d
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,例如,`.+(?!b).+`如果`(?!b)`失败,第一个`.+`将尝试匹配一个较短的字符串,然后检查完​​成再次.因此,`.+(?!b).+`将匹配`bbbabb`与第一个`.+`匹配`bbb`,第二个匹配`abb`.([演示](https://regex101.com/r/eE8rM0/1)) (2认同)
  • 与其说发生回溯,不如说指针从不移动可能更正确。当模式失败时,回溯与常规匹配一起发生。 (2认同)

lau*_*lga 8

@Antario,我对一段时间内正则表达式中的前方/后方的负面看法感到困惑,这个网站有一个很好的解释.

所以用你的例子你所说的是你有一个文字"a",它后面没有文字"b",后面跟着一个文字"c".

这是一个不同于你使用的正则表达式调试器,它提供了一个更直观的答案,我个人觉得有帮助:)

a(?!b)c

正则表达式可视化

Debuggex演示