【发布时间】:2012-01-24 09:45:41
【问题描述】:
有什么区别:
(.+?)
和
(.*?)
当我在我的 php preg_match regex 中使用它时?
【问题讨论】:
有什么区别:
(.+?)
和
(.*?)
当我在我的 php preg_match regex 中使用它时?
【问题讨论】:
它们被称为量词。
*0 个或多个前面的表达式
+ 1 个或多个前面的表达式
默认情况下,量词是贪婪的,这意味着它匹配尽可能多的字符。
在量词改变行为以使该量词“不贪婪”之后的?,意味着它将尽可能少地匹配。
贪心/不贪心的例子
例如关于字符串“abab”
a.*b 将匹配“abab”(preg_match_all 将返回一个匹配项,即“abab”)
而a.*?b 将仅匹配起始“ab”(preg_match_all 将返回两个匹配项,“ab”)
您可以在线测试您的正则表达式,例如在正则表达式上,see the greedy example here
【讨论】:
(.+?) 和 (.*?) 在正则表达式的不同位置(a(.+?)、(.+?)b、a(.+?)b、a(.*?)、(.*?)b、a(.*?)b)表现不同。
.* 将尽可能匹配。如果你想早点停下来,那么你必须让它变得不贪心.*?
第一个 (+) 是一个或多个字符。第二个 (*) 是零个或多个字符。两者都是非贪婪的 (?) 并且匹配任何东西 (.)。
【讨论】:
+ 至少匹配一个字符
* 匹配任意数量(包括 0)的字符
? 表示惰性表达式,因此它会匹配尽可能少的字符。
【讨论】:
+ 匹配上述模式的一个或多个 实例。 * 匹配前面模式的零个或多个实例。
所以基本上,如果您使用+,则必须至少有一个模式实例,如果您使用*,如果没有实例,它仍然会匹配。
【讨论】:
考虑下面是要匹配的字符串。
ab
模式(ab.*) 将返回匹配捕获组,结果为ab
而模式(ab.+) 将不匹配并且不返回任何内容。
但是如果你把字符串改成following,它会返回aba for pattern (ab.+)
aba
【讨论】:
在 RegEx 中,{i,f} 表示“在 i 到 f 之间匹配”。我们来看看下面的例子:
{3,7} 表示 3 到 7 个匹配项{,10} 表示最多 10 个匹配,没有下限(即下限为 0){3,} 表示至少 3 个匹配且没有上限(即上限为无穷大){,} 表示匹配数没有上限或下限(即下限为0,上限为无穷大){5} 正好是 4 大多数好的语言都包含缩写,RegEx 也是如此:
+ 是 {1,} 的简写
* 是 {,} 的简写
? 是 {,1} 的简写
这意味着+ 需要至少 1 个匹配项,而 * 接受任意数量的匹配项或根本不接受匹配项,? 接受不超过 1 个匹配项或零个匹配项。
来源:Codecademy.com
【讨论】:
+ 是最小的一,* 也可以是零。
【讨论】:
"+ is minimal one"这句话是什么意思?
星号与加号非常相似,唯一的区别是加号匹配前面字符/组的 1 个或多个,而星号匹配 0 个或多个。
【讨论】:
我认为前面的答案未能突出一个简单的例子:
例如我们有一个数组:
numbers = [5, 15]
以下正则表达式 ^[0-9]+ 仅匹配:15。
但是,^[0-9]* 匹配 5 and 15。不同之处在于+ 运算符需要至少一个 duplicate 前面的正则表达式
【讨论】:
5 和15。