两者之间有什么区别:
(.+?)
和
(.*?)
当我在PHP的preg_match
正则表达式中使用它时,会发生什么?
它们被称为量词。
*
表示匹配 0 或多个前面的表达式
+
表示匹配 1 或多个前面的表达式
默认情况下,量词是贪婪的,这意味着它会尽可能地匹配更多的字符。
在量词后面加上 ?
可以将其行为更改为“非贪婪”,这意味着它会尽可能地匹配更少的字符。
贪婪/非贪婪示例
例如,在字符串 "abab" 上:
a.*b
将匹配 "abab"(preg_match_all 将返回一个匹配项,即 "abab")
而 a.*?b
只会匹配起始的 "ab"(preg_match_all 将返回两个匹配项,即 "ab")
您可以在 Regexr 等网站上在线测试正则表达式,在此查看贪婪示例
/d+?
/d*?
{i,f}
表示“匹配次数在 i
到 f
之间”。让我们看一下以下几个例子:
{3,7}
表示匹配3到7次 {,10}
表示最多匹配10次而没有下限(即下限为0){3,}
表示至少匹配3次而没有上限(即上限为无穷大){,}
表示不限制匹配次数(即下限为0且上限为无穷大){5}
表示恰好匹配4次 大多数好的语言都包含缩写,正则表达式也是如此:
+
是 {1,}
的简写*
是 {,}
的简写?
是 {,1}
的简写这意味着 +
至少需要匹配一次,而 *
可以接受任意数量的匹配或者根本不匹配, ?
最多可以匹配一次或零次。
来源:Codecademy.com
+
匹配至少一个字符
*
匹配任意数量(包括 0)的字符
?
表示懒惰模式,它将匹配尽可能少的字符。
+
表示匹配前面的模式一次或多次。而*
表示匹配前面的模式零次或多次。
简单来说,如果使用+
,则必须至少有一个模式实例与之匹配;如果使用*
,即使没有任何模式实例与之匹配,也仍然会匹配成功。
ab
模式(ab.*)
将返回一个捕获组的匹配结果ab
而模式(ab.+)
不会匹配任何内容,也不会返回任何结果。
但是如果你将字符串更改为以下内容,则模式(ab.+)
将返回aba
。
aba
+
是至少一次的匹配,*
可以是零次或多次的匹配。
我认为之前的回答没有突出一个简单的例子:
比如我们有一个数组:
numbers = [5, 15]
^[0-9]+
只匹配15
。但是,^[0-9]*
会同时匹配5和15
。不同之处在于+
操作符要求至少有一个重复前面的正则表达式。5
和15
。 - mickmackusa
(.+?)
和(.*?)
的行为是不同的,这些位置包括a(.+?)
、(.+?)b
、a(.+?)b
、a(.*?)
、(.*?)b
和a(.*?)b
。 - Louis55.*
将尽可能匹配。如果你想尽早停止匹配,那么你必须使它变成非贪婪的.*?
。 - stemaa.*?b
将匹配 "abab" 中的第 1 个和第 2 个 "ab"。此外,在这个特定的解释中,“ungreedy”一词比“lazy”更好,因为“lazy”是编程中常用的术语,并且与本示例中?
的作用有点不同。 - starriet