2013-02-21 61 views
2

我正在浏览一些旧的代码库,并且遇到了两个我认为语义相同的正则表达式部分。想知道Stackoverflow社区可以证实我的理解。。+之间的区别(如果有)。和*

正则表达式1:(?+) - 一个或多个字符,但可选

正则表达式2: - 零个或多个字符

我一直在不同的场景思维,但不能(*)。想想两个表达式都不相同的任何输入。

+4

错误。 '(。+?)'是一个或多个字符,** lazy **匹配(匹配尽可能少)。 – nhahtdh 2013-02-21 02:43:19

+0

@nhahtdh Err,那就是答案。你为什么不把它贴出来? – BlackVegetable 2013-02-21 02:44:33

+0

谢谢@nhahtdh清理我的困惑 – 2013-02-21 02:52:51

回答

7

(.+?)意味着匹配的一个或多个字符,但代替默认贪婪匹配(匹配尽可能),则?量词后使匹配懒惰(匹配尽可能少)。

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

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

当您将模式更正为预期含义时:((?:.+)?),它与行为中的(.*)完全相同。由于量词默认为贪婪,因此((?:.+)?)在尝试空字符串的情况下将首先尝试.+的情况。并且.+将尝试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

+0

不会总是捕获0个字符然后'+?'总是捕获1(如果可能)? – BlackVegetable 2013-02-21 14:36:01

相关问题