了解负面的前瞻

我正试图了解简单例子中的负向预测是如何工作的。 例如,请考虑以下正则expression式:

a(?!b)c 

我认为负面的预测匹配一个位置。 因此,在这种情况下,正则expression式匹配任何包含严​​格3个字符且不是abcstring。

但这不是真的,在这个演示中可以看到。 为什么?

Lookaheads不会消耗任何字符。 它只是检查是否可以匹配lookahead:

 a(?!b)c 

所以在这里匹配a它只是检查它是否遵循不是由b但不消耗那not字符(这是c ),其次是c

a(?!b)cac相匹配

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

积极的前瞻

积极的前瞻是相似的,它试图匹配在向前的模式 。 如果可以匹配,则正则expression式引擎继续匹配模式的其余部分。 如果不能,比赛将被丢弃。

例如

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 

@Antario,我对于在正则expression式中的负面观察/背后的一段时间感到困惑, 这个网站有一个很好的解释。

所以你的例子你所说的是你有一个字面“a”,它不是后面跟着一个字面“b”,它后面是一个文字“c”。

这是一个不同的正则expression式debugging器比你使用,这给出了一个更直观的答案,个人,我觉得有帮助:)

a(?!b)c

正则表达式可视化

Debuggex演示

a(?!b)c将只匹配ac因为唯一的方法是你将有一个a后跟“not b ”(不会消耗),然后cac

所以,在这种情况下,正则expression式匹配任何包含严​​格3个字符而不是abc的string

这是不正确的。 这个正则expression式指出,我们正在search一个序列,其中第a符号是a ,之后是c ,在里面没有b

例如, a(?!b). 将匹配acaf因为对最后一个符号没有限制.