正则表达式加上明星区别?


90

之间有什么区别?

(.+?)

(.*?)

当我在phppreg_match正则表达式中使用它时?

Answers:


150

它们称为量词。

* 0个或多个前面的表达式

+ 前一个或多个表达式

默认情况下,量词是贪婪的,这意味着它匹配尽可能多的字符。

?一个量词后改变行为,使这个量词“ungreedy”,意味着它会匹配尽可能少。

贪婪/贪婪的例子

例如,在字符串“ abab ”上

a.*b 将匹配“ abab”(preg_match_all将返回一个匹配项,即“ abab”)

a.*?b仅匹配开头的“ ab”(preg_match_all将返回两个匹配“ ab”)

您可以在线测试您的正则表达式,例如在Regexr上,请参见此处的贪婪示例


2
“懒”是“ungreedy”更常用的术语
瓦尔特Tross

该示例不正确。无论(.+?)(.*?)行为不同的正则表达式的不同位置a(.+?)(.+?)ba(.+?)ba(.*?)(.*?)ba(.*?)b
Louis55

为什么a。* b不给“ ab”?它不是在说“ a和b之间的单词,0个或多个字符”,因此ab之间的字符为零,并且可以匹配。为什么这不正确?
世界世界你好

@HelloWorld,这与我上面解释的贪婪有关。.*将尽可能匹配。如果你想停止尽早,那么你就必须使它ungreedy.*?
STEMA

22

第一个(+)是一个或多个字符。第二个(*)是零个或多个字符。两者均为非贪婪(?)且匹配任何内容(.)。


1
这取决于是否设置了s修饰符。
昆汀

8

+匹配的一个或多个前面的模式的实例。甲*匹配零个或多个前面的模式的实例。

因此,基本上,如果使用a,+则必须至少有一个模式实例,如果使用*,则在没有实例的情况下仍将匹配。


8

+ 至少匹配一个字符

* 匹配任意数量(包括0)的字符

?指示慵懒的表情,所以它会匹配尽可能少的字符越好。


8

考虑以下是要匹配的字符串。

ab

该模式(ab.*)将返回与捕获组匹配的结果ab

虽然模式(ab.+)将不匹配,并且不返回任何内容。

但是,如果将字符串更改为following,它将返回aba为pattern(ab.+)

aba

我认为这是对+ vs *问题的更好答案
Terrence


5

在正则表达式,{i,f}意味着“之间i,以f匹配”。让我们看一下以下示例:

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

大多数好的语言都包含缩写,RegEx也包含缩写:

  • + 是的简写 {1,}
  • * 是的简写 {,}
  • ? 是的简写 {,1}

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

信用:Codecademy.com


4

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


2

我认为先前的答案未能强调一个简单的例子:

例如,我们有一个数组:

numbers = [5, 15]

以下正则表达式^[0-9]+匹配:15仅。但是,^[0-9]*两者都匹配5 and 15。不同之处在于,+运算符需要至少一个与前面的正则表达式相同的副本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.