两者的区别是什么:
(.+?)
还有
(.*?)
当我使用它在我的 php preg_match正则表达式?
preg_match
+是最小值,*也可以是零。
+
*
第一个(+)是 一个或多个字符。第二个(*)是 零个或多个字符。两者都是非贪婪的(?)和匹配的任何(.)。
?
.
+匹配前一模式的 一个或多个实例,*匹配前一模式的 zero or more实例。
所以基本上,如果您使用 +,那么必须至少有一个模式实例,如果您使用 *,那么如果没有模式实例,它仍然会匹配。
+至少匹配一个字符
*匹配任意数量(包括0)的字符
?表示一个延迟表达式,因此它将匹配尽可能少的字符。
它们被称为量词。
前面表达式的 *0或更多
前面表达式的 +1或更多
Per default a quantifier is greedy, that means it matches as many characters as possible.
量词后的 ?改变行为,使这个量词“不贪婪”,意味着它将匹配尽可能少。
例如贪婪的/不贪婪的
例如字符串“ abab”
a.*b将匹配“ abab”(preg _ match _ all 将返回一个匹配项,即“ abab”)
a.*b
而 a.*?b将只匹配开始的“ ab”(preg _ match _ all 将返回两个匹配项“ ab”)
a.*?b
You can test your regexes online e.g. on Regexr, 看看这个贪婪的例子
星号与加号非常相似,唯一的区别是,当加号匹配前面的字符/组中的1个或更多个时,星号匹配0个或更多个。
下面考虑要匹配的字符串。
ab
模式 (ab.*)将返回一个匹配的捕获组,其结果为 ab
(ab.*)
而模式 (ab.+)不会匹配,也不会返回任何东西。
(ab.+)
但是如果将字符串更改为 follow,它将返回 aba作为模式 (ab.+)
aba
我认为前面的答案没有突出一个简单的例子:
例如,我们有一个数组:
numbers = [5, 15]
下面的正则表达式 ^[0-9]+匹配: 只匹配 15。 但是,^[0-9]*与 5 and 15都匹配。不同之处在于,+运算符至少需要前一个正则表达式的一个 重复
^[0-9]+
15
^[0-9]*
5 and 15
在 RegEx 中,{i,f}的意思是“在 i到 f之间匹配”:
{i,f}
i
f
{3,7}
{,10}
{3,}
{,}
{5}
大多数优秀的语言都包含缩写,RegEx 也是如此:
{1,}
{,1}
这意味着 +需要至少1个匹配,而 *接受任意数量的匹配或根本不接受匹配,而 ?不接受超过1个匹配或零个匹配。
图片来源: Codecademy.com