我试图了解在简单示例中否定式前瞻是如何工作的。例如,考虑以下正则表达式:
a(?!b)c
我认为否定的前瞻匹配一个职位。因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是
abc
的字符串。但这不是真的,如 this demo 所示。为什么?
最佳答案
前行不占用任何字符。它只是检查前瞻是否可以匹配:
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
积极向前
正前瞻相似之处在于尝试匹配前瞻中的模式。如果可以匹配,则正则表达式引擎继续匹配其余模式。如果不能,则放弃匹配。
例如。
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
关于regex - 了解负面前瞻,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27691225/