有什么区别:
(.+?)
和
(.*?)
当我在 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}
这意味着
+
需要至少 1 个匹配项,而 *
接受任意数量的匹配项或根本没有匹配项,?
接受不超过 1 个匹配项或零个匹配项。
来源:Codecademy.com
+
匹配至少一个字符
*
匹配任意数量(包括0)个字符
?
表示惰性表达式,因此它将匹配尽可能少的字符。
A
+
匹配前述模式的一个或多个 实例。 *
匹配前述模式的零个或多个实例。
所以基本上,如果您使用
+
,则必须至少有一个该模式的实例,如果您使用*
,即使没有该模式的实例,它仍然会匹配。
考虑下面是要匹配的字符串。
ab
模式
(ab.*)
将返回捕获组的匹配结果,结果为 ab
虽然模式
(ab.+)
不会匹配并且不会返回任何内容。
但是如果将字符串更改为以下内容,它将返回
aba
模式 (ab.+)
aba
+
是最小的 1,*
也可以为零。
星号与加号非常相似,唯一的区别是加号匹配 1 个或多个前面的字符/组,而星号匹配 0 个或多个。
我认为之前的答案未能突出一个简单的例子:
例如我们有一个数组:
numbers = [5, 15]
以下正则表达式
^[0-9]+
仅匹配:15
。
但是,^[0-9]*
与 5 and 15
都匹配。不同之处在于 +
运算符需要至少一个 重复 前面的正则表达式