我试图理解为什么我不能从正则表达式中得到预期的结果。
我已经知道什么是负前瞻(显然不是:-)),而且星号是零次或多次重复。
看着这个正则表达式:
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星的负前瞻将始终被拒绝)。
您的图像也显示了这一点:
它说,如果不遵循,则表示它不能匹配盒子里的东西。问题是,不必只用一个字符就可以到达框的结尾。
这不适用于
a(?![^3]*7)
:在这里您说“**,如果遇到零个或多个非3后跟七个,则拒绝。由于正则表达式[^3]*7
与3333335
不匹配,因此超前查询不会拒绝匹配。关于javascript - 带星号的负前瞻如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32661162/