我试图理解为什么我没有得到正则表达式的预期结果.
我已经知道什么是负向前瞻(显然不是:-))而且星号是重复的零次或多次.
看看这个正则表达式:
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
这里发生了什么?
问题是星号可以生成空字符串(""),你可以说每个字符和下一个字符之间都有一个空字符串.
鉴于正则表达式:
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,前瞻不会拒绝匹配.
问题是*会重复零次或多次.包括零非3s(也称为空字符串).没有什么不意味着字符串的结尾,它意味着什么都没有(空字符串).
有效的例子之所以7是因为前瞻会尝试匹配尽可能多的非3.在之后的位置a,那将是零非3s.在那之后,它将尝试恰好匹配一个7.但是下一个字符是3,因此前瞻不会失败的匹配a.
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |