我试图了解负面前瞻在简单示例中的作用。例如,请考虑以下正则表达式:
a(?!b)c
我认为负向前瞻与位置匹配。因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc
的字符串。
但事实并非如此,可以在 this demo 中看到。为什么?
答案 0 :(得分:45)
Lookaheads不消耗任何字符。它只检查前瞻是否匹配:
a(?!b)c
所以在匹配a
之后,只有检查,如果它不是b
,而是不使用not
字符({{1}然后是c
。
c
如何匹配a(?!b)c
ac
正向前瞻是类似的,因为 尝试匹配前瞻 中的模式。如果它可以匹配,那么正则表达式引擎继续匹配模式的其余部分。如果不能,则丢弃该匹配。
E.g。
匹配ac
|
a
ac
|
(?!b) #checks but does not consume. Pointer remains at c
ac
|
c
的 abc(?=123)\d+
abc123
答案 1 :(得分:8)
@Antario,我对一段时间内正则表达式中的前方/后方的负面看法感到困惑,this网站有很好的解释。
所以用你的例子你所说的是你有一个文字" a"并且它后面没有文字" b"然后是文字" c"。
这是一个与你使用的不同的正则表达式调试器,它提供了一个更直观的答案,我觉得这个答案很有用:)
a(?!b)c
答案 2 :(得分:3)
a(?!b)c
仅匹配ac
,因为唯一的方法是让a
后跟“not b
”(不会被消费),然后{ {1}},c
。
答案 3 :(得分:2)
因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc的字符串
这不太对。这个正则表达式表明我们正在搜索firstsymbol为a
的序列,之后是c
,而里面没有b
。
例如,a(?!b).
将匹配ac
或af
,因为.