2

我正在查看一些旧代码库,并遇到了两个我认为在语义上相同的正则表达式部分。想知道 Stackoverflow 社区可以证实我的理解。

RegEx 1: (.+?) - 一个或多个字符,但可选

正则表达式 2:(.*) - 零个或多个字符

我一直在考虑不同的场景,但想不出任何两个表达式都不相同的输入。

4

2 回答 2

7

(.+?)表示匹配一个或多个字符,但不是默认的贪婪匹配(尽可能匹配),?后量词使匹配变得懒惰(尽可能少匹配)。

从概念上讲,贪心匹配将首先尝试内部模式可以形成的最长可能序列,然后随着引擎回溯逐渐减少序列的长度。惰性匹配会首先尝试内部模式可以形成的最短序列,然后随着引擎回溯逐渐增加序列的长度。

因此,(.+?)(.*)是完全不同的。给定一个字符串"abc",模式(.+?)将匹配"a"第一个匹配,而(.*)将匹配"abc"第一个匹配。

当您将模式更正为预期含义时:((?:.+)?),它与行为完全相同(.*)。由于量词默认是贪婪的,在尝试空字符串的情况之前((?:.+)?)会先尝试的情况。.+并且.+会在 1 个字符序列之前尝试最长的序列。因此,效果((?:.+)?)完全一样(.*):会找到最长的序列,并逐渐回溯到空字符串的情况。

于 2013-02-21T02:50:04.027 回答
3

第一的,

. is any character

下一个

* is zero or more
+ is one or more 
? is one or zero

你是这么想的。+?是一个或多个任何字符,我猜是其中的 0 个或 1 个?你错过了这个:

懒惰的修饰符

*? is zero or more getting as few as possible
+? is one or more getting as few as possible

请参阅此处以进一步讨论 贪婪与不情愿与占有量词

于 2013-02-21T02:53:38.957 回答