我试图了解在简单示例中否定式前瞻是如何工作的。例如,考虑以下正则表达式:

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/

10-09 04:42