我正在查看一些旧的代码库,并且遇到了两个正则表达式部分,我认为它们在语义上是相同的。想知道Stackoverflow社区可以证实我的理解。
RegEx 1 :(。+?) - 一个或多个字符,但可选
RegEx 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