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

Bab*_*fas 2 regex regex-greedy

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

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

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

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

nha*_*tdh 7

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

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

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

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