了解负面的前瞻
我正试图了解简单例子中的负向预测是如何工作的。 例如,请考虑以下正则expression式:
a(?!b)c
我认为负面的预测匹配一个位置。 因此,在这种情况下,正则expression式匹配任何包含严格3个字符且不是abc
string。
但这不是真的,在这个演示中可以看到。 为什么?
Lookaheads不会消耗任何字符。 它只是检查是否可以匹配lookahead:
a(?!b)c
所以在这里匹配a
它只是检查它是否遵循不是由b
但不消耗那not
字符(这是c
),其次是c
。
a(?!b)c
与ac
相匹配
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
”(不会消耗),然后c
是ac
。
所以,在这种情况下,正则expression式匹配任何包含严格3个字符而不是abc的string
这是不正确的。 这个正则expression式指出,我们正在search一个序列,其中第a
符号是a
,之后是c
,在里面没有b
。
例如, a(?!b).
将匹配ac
或af
因为对最后一个符号没有限制.