理解消极的先行

时间:2014-12-29 15:03:45

标签: regex regex-lookarounds

我试图了解负面前瞻在简单示例中的作用。例如,请考虑以下正则表达式:

a(?!b)c

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

但事实并非如此,可以在 this demo 中看到。为什么?

4 个答案:

答案 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

Regular expression visualization

Debuggex Demo

答案 2 :(得分:3)

a(?!b)c仅匹配ac,因为唯一的方法是让a后跟“not b”(不会被消费),然后{ {1}},c

答案 3 :(得分:2)

  
    

因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc的字符串

  

这不太对。这个正则表达式表明我们正在搜索firstsymbol为a的序列,之后是c,而里面没有b

例如,a(?!b).将匹配acaf,因为.

对最后一个符号没有限制