为什么它与整个文本不匹配?
哦,试过了。但是它在一个位置找到了序列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+
因此没有任何可以匹配的东西,正则表达式失败。