Java 贪婪量词

Java 贪婪量词,java,regex,quantifiers,Java,Regex,Quantifiers,我在读K.Sierra时发现了以下句子: 贪婪量词实际上读取了整个源数据,然后它就工作了 向后(从右边)直到找到最右边的匹配项。在那一点上,它 包括所有内容,从源数据的前面部分到 是最右边比赛的一部分 现在,假设我们有如下来源: "proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java" 和模式:proj1([^,])* 为什么它与全文不匹配?由于贪婪,它应该匹配最右边的“proj1.java”,并且返回的匹配应该是最右边匹配之前的整个源代码?相反,它返

我在读K.Sierra时发现了以下句子:

贪婪量词实际上读取了整个源数据,然后它就工作了 向后(从右边)直到找到最右边的匹配项。在那一点上,它 包括所有内容,从源数据的前面部分到 是最右边比赛的一部分

现在,假设我们有如下来源:

"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
。而不是整个输入。正则表达式是懒惰的,它们只匹配需要匹配的内容,而且永远不会进一步

但是。这就是它变得有趣的地方。有些发动机不能这样工作

考虑regex
cat(| flap)
和输入文本
catflap
。POSIX尝试了正则表达式引擎,并规定正则表达式引擎应该匹配最左边、最长的匹配

因此,如果正则表达式引擎遵循POSIX,它应该匹配
catflap
。但是,在这里,现有的大多数正则表达式引擎将只匹配
cat
:空的替换首先匹配,正则表达式满足,故事结束

现在,问题的核心是:量词有三种类型,贪婪、懒惰和占有:

  • 贪婪:默认值,
    *
  • 懒惰,又称过度使用:
    *?
  • 所有格:
    *+
一个贪婪的量词会尝试匹配尽可能多的文本,并且只有在必要时才会返回;一个懒惰的量词会尝试匹配尽可能少的文本;所有格量词会尝试匹配尽可能多的文本,并且不会返回文本

插图:以下是输入文本:

The answer to everything is 42, says the mouse
以下三个正则表达式与此文本匹配,并带有一个捕获组:

  • *(\d+)
    (贪婪)
  • *?(\d+)
    (惰性)
  • *+(\d+)
    (所有格)
问题:团队将在每个表达式中捕获什么?答复:

  • 第一个:
    2
  • 第二个:
    42
  • 第三:甚至不会匹配文本
    *+
    将吞下一切,但不会归还,
    \d+
    因此没有任何可以匹配的内容,regex失败
我们有
proj1([^,])*
其中-

([^,]])*
表示它将连接以下任意组合的子字符串: 字符(出现零次或多次),它不包含字符','和字符串“proj1”,如:
“sched.pdf”或“or”.java”这三个字符都不包含“,”字符。结果就是这样。

对不起,我以前不清楚。我的意思是,假设我将源代码指定为“xfooxfoo”,将regex指定为。*foo,那么在这种情况下,为什么整个源代码(即xfooxfoo)都会匹配?为什么上面的例子不一样?