我正在查看一些旧代码库,并遇到了两个我认为在语义上相同的正则表达式部分。想知道 Stackoverflow 社区可以证实我的理解。
RegEx 1: (.+?) - 一个或多个字符,但可选
正则表达式 2:(.*) - 零个或多个字符
我一直在考虑不同的场景,但想不出任何两个表达式都不相同的输入。
我正在查看一些旧代码库,并遇到了两个我认为在语义上相同的正则表达式部分。想知道 Stackoverflow 社区可以证实我的理解。
RegEx 1: (.+?) - 一个或多个字符,但可选
正则表达式 2:(.*) - 零个或多个字符
我一直在考虑不同的场景,但想不出任何两个表达式都不相同的输入。
(.+?)
表示匹配一个或多个字符,但不是默认的贪婪匹配(尽可能匹配),?
后量词使匹配变得懒惰(尽可能少匹配)。
从概念上讲,贪心匹配将首先尝试内部模式可以形成的最长可能序列,然后随着引擎回溯逐渐减少序列的长度。惰性匹配会首先尝试内部模式可以形成的最短序列,然后随着引擎回溯逐渐增加序列的长度。
因此,(.+?)
和(.*)
是完全不同的。给定一个字符串"abc"
,模式(.+?)
将匹配"a"
第一个匹配,而(.*)
将匹配"abc"
第一个匹配。
当您将模式更正为预期含义时:((?:.+)?)
,它与行为完全相同(.*)
。由于量词默认是贪婪的,在尝试空字符串的情况之前((?:.+)?)
会先尝试的情况。.+
并且.+
会在 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
请参阅此处以进一步讨论 贪婪与不情愿与占有量词