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匹配acac
|
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)
@Antario,我对一段时间内正则表达式中的前方/后方的负面看法感到困惑,这个网站有一个很好的解释.
所以用你的例子你所说的是你有一个文字"a",它后面没有文字"b",后面跟着一个文字"c".
这是一个不同于你使用的正则表达式调试器,它提供了一个更直观的答案,我个人觉得有帮助:)
a(?!b)c
