gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:06:00 29 4
gpt4 key购买 nike

我试图理解为什么我没有从正则表达式中获得预期的结果。

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

看看这个正则表达式:

a(?![^3])

Regular expression visualization

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

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

a3333335

好的

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

a(?![^3]+)  //notice "+"

Regular expression visualization

它仍然会匹配:

a3333335

这将匹配 a 后面没有非 3(至少一个)

问题

我的问题是 * :

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

a(?![^3]*)

Regular expression visualization

这将不匹配

a3333335

但我的问题是 - 为什么?

根据图纸:

a 后面不应跟:Either nothing or neither non-3's

但这确实发生了:a 后面没有任何东西 AND 后面没有非 3- 的

那么为什么不匹配呢?

让我的生活更加艰难:

看看这个正则表达式:

a(?![^3]*7)

这将匹配:

a3333335

这是怎么回事?

最佳答案

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

给定正则表达式:

a(?![^3]*)

并且您使用 a33333 进行查询,您或多或少会说:如果在 a 之后有零个或多个非 3 重复,则拒绝,但存在这样的重复:空字符串,因此即使没有捕获单个 3,它也会拒绝。因此匹配看起来像:

a    (?![^3]*)
"a" "" "33333"

(引号是字符串,这里不是字符)

因此,您可以说Kleene 星形正则表达式的负前瞻 将始终拒绝(一定要小心,在句子中我的意思是Kleene 星号在“整个”正则表达式上统一,这并不意味着包含 Kleene 星号的否定前瞻将始终被拒绝。

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

enter image description here

它说if not followed,这意味着它不能匹配盒子里面的东西。问题是,它不需要一个字符就可以到达框的末尾。


这不适用于 a(?![^3]*7):在这里你说“*reject if you encounter zero-or more non-3后跟一个七。由于正则表达式 [^3]*7 不匹配 3333335,因此先行不会拒绝匹配。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com