正则expression式加上星星的区别?
有什么区别:
(.+?)
和
(.*?)
当我在我的PHP preg_match
正则expression式中使用它?
他们被称为量词。
*
0或更多的前面的expression式
前面的expression式+
1或更多
默认情况下,一个量词是贪婪的,这意味着它匹配尽可能多的字符。
这个?
量词改变行为后使这个量词“不确定”,意味着它会尽可能less地匹配。
示例贪婪/ ungreedy
例如在string“ abab ”
a.*b
将匹配“abab”(preg_match_all将返回一个匹配,“abab”)
而a.*?b
只会匹配开始的“ab”(preg_match_all将返回两个匹配,“ab”)
你可以在线testing你的正则expression式,例如Regexr, 看到这里的贪婪的例子
第一个( +
)是一个或多个字符 。 第二个( *
)是零个或多个字符 。 两者都是非贪婪的( ?
)并匹配任何东西( .
)。
+
是最小的一个, *
也可以是零。
A +
匹配前一个模式的一个或多个实例。 A *
匹配前面的模式的零个或多个实例。
所以基本上,如果你使用+
那么必须至less有一个模式的实例,如果你使用*
,如果没有它的实例,它仍然会匹配。
+
至less匹配一个字符
*
匹配任何数字(包括0)的字符
这个?
表示一个懒惰的expression,所以它会匹配尽可能less的字符。
星号与加号非常相似,唯一的区别是加号匹配1个或多个前一个字符/组时,起始匹配0或更多。
考虑下面是匹配的string。
ab
模式(ab.*)
将返回捕获组的匹配结果ab
模式(ab.+)
不匹配,不返回任何内容。
但是,如果将string更改为跟随,则将返回模式(ab.+)
aba
aba
我认为以前的答案没有突出一个简单的例子:
例如我们有一个数组:
numbers = [5, 15]
以下正则expression式^[0-9]+
仅匹配: 15
。 但是, ^[0-9]*
与5 and 15
都匹配。 不同的是, +
运算符至less需要一个前面的正则expression式的副本