我正在浏览一些旧的代码库,并且遇到了两个我认为语义相同的正则表达式部分。想知道Stackoverflow社区可以证实我的理解。。+之间的区别(如果有)。和*
正则表达式1:(?+) - 一个或多个字符,但可选
正则表达式2: - 零个或多个字符
我一直在不同的场景思维,但不能(*)。想想两个表达式都不相同的任何输入。
我正在浏览一些旧的代码库,并且遇到了两个我认为语义相同的正则表达式部分。想知道Stackoverflow社区可以证实我的理解。。+之间的区别(如果有)。和*
正则表达式1:(?+) - 一个或多个字符,但可选
正则表达式2: - 零个或多个字符
我一直在不同的场景思维,但不能(*)。想想两个表达式都不相同的任何输入。
(.+?)
意味着匹配的一个或多个字符,但代替默认贪婪匹配(匹配尽可能),则?
量词后使匹配懒惰(匹配尽可能少)。
概念上,贪婪匹配将首先尝试可能由内部模式形成的最长可能的序列,然后在发动机回溯时逐渐减少序列的长度。延迟匹配将首先尝试可能由内部模式形成的最短序列,然后在引擎回溯时逐渐增加序列的长度。
因此,(.+?)
和(.*)
是完全不同的。给定字符串,模式(.+?)
将匹配"a"
的第一场比赛,而(.*)
将匹配第一场比赛。
当您将模式更正为预期含义时:((?:.+)?)
,它与行为中的(.*)
完全相同。由于量词默认为贪婪,因此((?:.+)?)
在尝试空字符串的情况下将首先尝试.+
的情况。并且.+
将尝试1个字符序列之前的最长序列。因此,((?:.+)?)
的效果与(.*)
完全相同:它会逐渐找到最长的序列并回溯到空字符串的情况。
首先,
. 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
不会总是捕获0个字符然后'+?'总是捕获1(如果可能)? – BlackVegetable 2013-02-21 14:36:01
错误。 '(。+?)'是一个或多个字符,** lazy **匹配(匹配尽可能少)。 – nhahtdh 2013-02-21 02:43:19
@nhahtdh Err,那就是答案。你为什么不把它贴出来? – BlackVegetable 2013-02-21 02:44:33
谢谢@nhahtdh清理我的困惑 – 2013-02-21 02:52:51