正则表达式中的加号和星号有什么区别? [重复]

问题描述 投票:0回答:9

有什么区别:

(.+?)

(.*?)

当我在 php

preg_match
正则表达式中使用它时?

php regex
9个回答
210
投票

它们被称为量词。

*
0 个或多个前述表达式

+
1 个或多个前述表达式

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

量词后面的

?
改变了行为,使这个量词“不贪婪”,意味着它将尽可能少地匹配。

示例贪婪/不贪婪

例如字符串“abab

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

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

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


23
投票

第一个 (

+
) 是一个或多个字符。第二个 (
*
) 是零个或多个字符

两者都有贪婪(默认)和惰性(

?
)变体

/d+?
/d*?

18
投票

在正则表达式中,

{i,f}
表示“
i
f
匹配”。让我们看一下以下示例:

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

大多数好的语言都包含缩写,正则表达式也是如此:

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

这意味着

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

来源:Codecademy.com


11
投票

+
匹配至少一个字符

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

?
表示惰性表达式,因此它将匹配尽可能少的字符。


10
投票

A

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

所以基本上,如果您使用

+
,则必须至少有一个该模式的实例,如果您使用
*
,即使没有该模式的实例,它仍然会匹配。


10
投票

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

ab

模式

(ab.*)
将返回捕获组的匹配结果,结果为
ab

虽然模式

(ab.+)
不会匹配并且不会返回任何内容。

但是如果将字符串更改为以下内容,它将返回

aba
模式
(ab.+)

aba

6
投票

+
是最小的 1,
*
也可以为零。


5
投票

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


0
投票

我认为之前的答案未能突出一个简单的例子:

例如我们有一个数组:

numbers = [5, 15]

以下正则表达式

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

© www.soinside.com 2019 - 2024. All rights reserved.