0

我正在阅读 K.Sierra 并发现以下句子:

贪心量词实际上确实读取了整个源数据,然后它向后(从右边)工作,直到找到最右边的匹配。此时,它包括从源数据中较早的所有内容,直到并包括作为最右边匹配的一部分的数据。

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

"proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java"

和模式:proj1([^,])*

为什么它与整个文本不匹配?贪婪它应该匹配最右边的“proj1.java”并且返回的匹配应该是最右边匹配之前的整个源?相反,它返回:

proj1sched.pdf
proj1
proj1.java
4

3 回答 3

2

为什么它与整个文本不匹配?

因为你说它必须从proj1

贪婪它应该匹配最右边的“proj1.java”

正确的。

并且返回的匹配应该是最正确匹配之前的整个源?

不知道你为什么会这样想,或者为什么会有用。.*proj1.*如果这是你想要的,你可以这样做。

于 2013-06-19T21:13:15.940 回答
0

为什么它与整个文本不匹配?

哦,试过了。但是它在一个位置找到了序列p, r, o, j,1然后继续找到零个或多个不是逗号的字符,因此匹配., p, d, f。它停在那里,因为下一个字符是逗号,不匹配[^,]

请注意,下一次匹配尝试将从下一个字符开始,即r,依此类推,直到找到p; 当它找到一个时,它会尝试r,等等。

正则表达式完全满足,引擎认为它是成功的并且没有进一步尝试,即使超过那个点还有匹配

因此匹配的文本proj1.pdf是. 而不是整个输入。正则表达式是惰性的,它们只匹配他们需要匹配的内容,而不再进一步。

但。这就是有趣的地方。有些引擎不是这样工作的。

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

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

现在,到问题的核心:量词分为三种类型,贪婪、懒惰和所有格:

  • 贪婪:默认,*;
  • 懒惰,又名过度使用:*?;
  • 占有欲:*+.

贪婪的量词会尝试匹配尽可能多的文本,并且仅在必须时才返回;惰性量词会尝试匹配尽可能少的文本;所有格量词将尝试匹配尽可能多的文本,并且不会返回文本。

插图:这是输入文本:

The answer to everything is 42, says the mouse

以下是三个匹配此文本的正则表达式,带有一个捕获组:

  • .*(\d+)(贪婪的);
  • .*?(\d+)(懒惰的);
  • .*+(\d+)(所有格)。

问题:小组将在这些表达中捕捉到什么?回答:

  • 第一个:2;
  • 第二个:42;
  • 第三:连文字都不会匹配!.*+将吞噬一切但不会归还,\d+因此没有任何可以匹配的东西,正则表达式失败。
于 2013-06-19T21:37:48.230 回答
-1

我们proj1([^,])*在其中 -

([^,])*意味着它将连接任何字符组合的子字符串(出现零次或多次),不包含字符','与字符串“proj1”,如:“sched.pdf”或“”或“.java”全部三不包括','字符。因此结果。

于 2015-01-24T18:42:15.470 回答