我试图理解为什么我不能从正则表达式中得到预期的结果。

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

看着这个正则表达式:

a(?![^3])

这将匹配a,之后没有non-3

因此,查看此测试字符串,粗体部分是一个匹配项:



好的

另外-如果我将正则表达式更改为:
a(?![^3]+)  //notice "+"

它将仍然匹配:



这将匹配a,后跟非3(至少一个)

问题

我的问题是*:

让我们将正则表达式更改为:
a(?![^3]*)

这将不匹配



但是我的问题是-为什么?

根据图纸:
a后面不应加上:都不为非3

但这确实在发生:a之后没有空,而之后没有non3-

那么为什么不匹配呢?

为了让我的生活更加艰难:

看着这个正则表达式:
a(?![^3]*7)

这将匹配:



这里发生了什么?

最佳答案

问题是星号可以生成空字符串(""),并且您可以说每个字符与下一个字符之间的都有一个空字符串

鉴于正则表达式:

a(?![^3]*)

然后使用a33333查询,您或多或少说:拒绝a之后是否存在非零的3重复或零个以上的重复,但是有这样的重复:空字符串,因此即使不捕获单个3,它也会拒绝。因此,匹配看起来像:
a    (?![^3]*)
"a"     ""   "33333"

(引号标记字符串,此处没有字符)

因此,您可以说,对Kleene星的正则表达式的负向前看总是会拒绝(必须注意,在句子中,我的意思是Kleene星在“整个”正则表达式中是统一的,但这不是表示包含Kleene星的负前瞻将始终被拒绝)。

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

javascript - 带星号的负前瞻如何工作?-LMLPHP

它说,如果不遵循,则表示它不能匹配盒子里的东西。问题是,不必只用一个字符就可以到达框的结尾。

这不适用于a(?![^3]*7):在这里您说“**,如果遇到零个或多个非3后跟七个,则拒绝。由于正则表达式[^3]*73333335不匹配,因此超前查询不会拒绝匹配。

关于javascript - 带星号的负前瞻如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32661162/

10-12 06:45