。+之间的差异(如果有的话)和。*

时间:2013-02-21 02:40:58

标签: regex regex-greedy

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

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

RegEx 2:(。*) - 零个或多个字符

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

2 个答案:

答案 0 :(得分:7)

(.+?)表示匹配一个或多个字符,但不是默认的贪心匹配(尽可能匹配),量词之后的?进行匹配< em> lazy (匹配尽可能少)。

概念上,贪婪匹配将首先尝试可由内部模式形成的最长可能序列,然后在引擎回溯时逐渐减少序列的长度。延迟匹配将首先尝试由内部模式形成的最短可能序列,然后在引擎回溯时逐渐增加序列的长度。

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

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

答案 1 :(得分: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

请参阅此处以获得进一步的讨论 Greedy vs. Reluctant vs. Possessive Quantifiers