星号的负面前瞻是如何工作的?

Roy*_*mir 8 javascript regex

我试图理解为什么我没有得到正则表达式的预期结果.

我已经知道什么是负向前瞻(显然不是:-))而且星号是重复的零次或多次.

看看这个正则表达式:

a(?![^3])
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

这将匹配a后面没有跟着non-3它.

所以看看这个测试字符串,粗体部分就是匹配:

3333335

另外 - 如果我将正则表达式更改为:

a(?![^3]+)  //notice "+"
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

它仍将匹配:

3333335

这将匹配a未跟随非3(至少一个)

我的问题是*:

让我们将正则表达式更改为:

a(?![^3]*)
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

这不符合

a3333335

但我的问题是 - 为什么?

根据图纸:

a不应该依次为:无论什么 没有非-3

但这是发生的事情:a没有任何事情,并没有跟随non3-'s

那为什么它不匹配?

并使我的生活更加艰难:

看看这个正则表达式:

a(?![^3]*7)
Run Code Online (Sandbox Code Playgroud)

这将匹配:

3333335

这里发生了什么?

Wil*_*sem 6

问题是星号可以生成空字符串(""),你可以说每个字符和下一个字符之间都有一个空字符串.

鉴于正则表达式:

a(?![^3]*)
Run Code Online (Sandbox Code Playgroud)

并且您查询a33333,或多或少地说:拒绝如果之后有非零或更多重复a,但是有这样的重复:空字符串,所以即使没有捕获单个3,它也会拒绝.因此匹配如下:

a    (?![^3]*)
"a"     ""   "33333"
Run Code Online (Sandbox Code Playgroud)

(引号标记字符串,这里没有字符)

因此,你可以说,负先行在正则表达式中,克莱尼明星总是拒绝(一定要小心,在句子我的意思是,克林星统一在"整个"正则表达式,但这并不意味着包含Kleene星的负向前瞻总是拒绝).

您的图片也显示了这一点:

在此输入图像描述

它表示如果不遵循,则意味着它无法与盒子内部的内容相匹配.问题是,它不需要单个字符到达框的末尾.


这不适用于a(?![^3]*7):在这里你说"*拒绝,如果你遇到零或更多的非3,然后是七.由于正则表达式[^3]*7不匹配3333335,前瞻不会拒绝匹配.


ndn*_*kov 5

问题是*会重复次或多次.包括零非3s(也称为空字符串).没有什么不意味着字符串的结尾,它意味着什么都没有(空字符串).

有效的例子之所以7是因为前瞻会尝试匹配尽可能多的非3.在之后的位置a,那将是非3s.在那之后,它将尝试恰好匹配一个7.但是下一个字符是3,因此前瞻不会失败的匹配a.