Java 贪婪量词
我在读K.Sierra时发现了以下句子: 贪婪量词实际上读取了整个源数据,然后它就工作了 向后(从右边)直到找到最右边的匹配项。在那一点上,它 包括所有内容,从源数据的前面部分到 是最右边比赛的一部分 现在,假设我们有如下来源:Java 贪婪量词,java,regex,quantifiers,Java,Regex,Quantifiers,我在读K.Sierra时发现了以下句子: 贪婪量词实际上读取了整个源数据,然后它就工作了 向后(从右边)直到找到最右边的匹配项。在那一点上,它 包括所有内容,从源数据的前面部分到 是最右边比赛的一部分 现在,假设我们有如下来源: "proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java" 和模式:proj1([^,])* 为什么它与全文不匹配?由于贪婪,它应该匹配最右边的“proj1.java”,并且返回的匹配应该是最右边匹配之前的整个源代码?相反,它返
"proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java"
和模式:proj1([^,])*
为什么它与全文不匹配?由于贪婪,它应该匹配最右边的“proj1.java”,并且返回的匹配应该是最右边匹配之前的整个源代码?相反,它返回:
proj1sched.pdf
proj1
proj1.java
为什么它与全文不匹配
因为您声明它必须以proj1
由于贪婪,它应该匹配最右边的“proj1.java”
对
返回的匹配应该是最右边匹配之前的整个源
不知道你为什么会这么想,或者为什么那会有用。如果这是您想要的,您只需执行*proj1.*
为什么它与全文不匹配
哦,它试过了。但它在一个点上找到了序列p
,r
,o
,j
,1
,然后找到了零个或多个不是逗号的字符,因此匹配了
,p
,d
,f
。它停在那里,因为下一个字符是逗号,与[^,]
不匹配
请注意,下一次匹配尝试将从下一个字符开始,即r
,依此类推,直到找到p
;当它找到一个时,它将尝试r
,等等
正则表达式整体上是满意的,引擎决定它是成功的,并且没有进一步尝试,即使有超过这一点的匹配
因此,匹配的文本为proj1.pdf
。而不是整个输入。正则表达式是懒惰的,它们只匹配需要匹配的内容,而且永远不会进一步
但是。这就是它变得有趣的地方。有些发动机不能这样工作
考虑regexcat(| flap)
和输入文本catflap
。POSIX尝试了正则表达式引擎,并规定正则表达式引擎应该匹配最左边、最长的匹配
因此,如果正则表达式引擎遵循POSIX,它应该匹配catflap
。但是,在这里,现有的大多数正则表达式引擎将只匹配cat
:空的替换首先匹配,正则表达式满足,故事结束
现在,问题的核心是:量词有三种类型,贪婪、懒惰和占有:
- 贪婪:默认值,
李>*
- 懒惰,又称过度使用:
李>*?
- 所有格:
*+
The answer to everything is 42, says the mouse
以下三个正则表达式与此文本匹配,并带有一个捕获组:
(贪婪)李>*(\d+)
(惰性)李>*?(\d+)
(所有格)*+(\d+)
- 第一个:
李>2
- 第二个:
李>42
- 第三:甚至不会匹配文本
将吞下一切,但不会归还,*+
因此没有任何可以匹配的内容,regex失败\d+
proj1([^,])*
其中-
([^,]])*
表示它将连接以下任意组合的子字符串:
字符(出现零次或多次),它不包含字符','和字符串“proj1”,如:
“sched.pdf”或“or”.java”这三个字符都不包含“,”字符。结果就是这样。对不起,我以前不清楚。我的意思是,假设我将源代码指定为“xfooxfoo”,将regex指定为。*foo,那么在这种情况下,为什么整个源代码(即xfooxfoo)都会匹配?为什么上面的例子不一样?