正则表达式加星差?

两者的区别是什么:

(.+?)

还有

(.*?)

当我使用它在我的 php preg_match正则表达式?

121931 次浏览

+是最小值,*也可以是零。

第一个(+)是 一个或多个字符。第二个(*)是 零个或多个字符。两者都是非贪婪的(?)和匹配的任何(.)。

+匹配前一模式的 一个或多个实例,*匹配前一模式的 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将只匹配开始的“ ab”(preg _ match _ all 将返回两个匹配项“ ab”)

You can test your regexes online e.g. on Regexr, 看看这个贪婪的例子

星号与加号非常相似,唯一的区别是,当加号匹配前面的字符/组中的1个或更多个时,星号匹配0个或更多个。

下面考虑要匹配的字符串。

ab

模式 (ab.*)将返回一个匹配的捕获组,其结果为 ab

而模式 (ab.+)不会匹配,也不会返回任何东西。

但是如果将字符串更改为 follow,它将返回 aba作为模式 (ab.+)

aba

我认为前面的答案没有突出一个简单的例子:

例如,我们有一个数组:

numbers = [5, 15]

下面的正则表达式 ^[0-9]+匹配: 只匹配 15。 但是,^[0-9]*5 and 15都匹配。不同之处在于,+运算符至少需要前一个正则表达式的一个 重复

在 RegEx 中,{i,f}的意思是“在 if之间匹配”:

  • {3,7}意味着3到7场比赛
  • {,10}意味着最多10场没有下限的比赛(即下限为0)
  • {3,}意味着至少3个没有上限的匹配(即最高上限是无穷大)
  • {,}表示比赛次数没有上限或下限(即下限为0,上限为无穷)
  • {5}正好是4

大多数优秀的语言都包含缩写,RegEx 也是如此:

  • +{1,}的简写
  • *{,}的简写
  • ? is the shorthand for {,1}

这意味着 +需要至少1个匹配,而 *接受任意数量的匹配或根本不接受匹配,而 ?不接受超过1个匹配或零个匹配。

图片来源: Codecademy.com