正则表达式加与星号的区别? [复制]
Posted
技术标签:
【中文标题】正则表达式加与星号的区别? [复制]【英文标题】:Regex plus vs star difference? [duplicate] 【发布时间】:2012-01-24 09:45:41 【问题描述】:有什么区别:
(.+?)
和
(.*?)
当我在我的 php preg_match
regex 中使用它时?
【问题讨论】:
【参考方案1】:它们被称为量词。
*
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
)表现不同。
为什么 a.*b 不回馈“ab”?它不是说“在 a 和 b 之间有 0 个或多个字符的单词”,因此,ab 之间的字符为零并且可能是匹配项。为什么这是不正确的?
@HelloWorld,这与我上面解释的贪婪有关。 .*
将尽可能匹配。如果你想早点停下来,那么你必须让它变得不贪心.*?
【参考方案2】:
第一个 (+
) 是一个或多个字符。第二个 (*
) 是零个或多个字符。两者都是非贪婪的 (?
) 并且匹配任何东西 (.
)。
【讨论】:
这取决于是否设置了 s 修饰符。【参考方案3】:+
至少匹配一个字符
*
匹配任意数量(包括 0)的字符
?
表示惰性表达式,因此它会匹配尽可能少的字符。
【讨论】:
【参考方案4】:+
匹配上述模式的一个或多个 实例。 *
匹配前面模式的零个或多个实例。
所以基本上,如果您使用+
,则必须至少有一个模式实例,如果您使用*
,如果没有实例,它仍然会匹配。
【讨论】:
【参考方案5】:考虑下面是要匹配的字符串。
ab
模式(ab.*)
将返回匹配捕获组,结果为ab
而模式(ab.+)
将不匹配并且不返回任何内容。
但是如果你把字符串改成following,它会返回aba
for pattern (ab.+)
aba
【讨论】:
【参考方案6】:在 RegEx 中,i,f
表示“在 i
到 f
之间匹配”。我们来看看下面的例子:
3,7
表示 3 到 7 个匹配项
,10
表示最多 10 个匹配,没有下限(即下限为 0)
3,
表示至少 3 个匹配且没有上限(即上限为无穷大)
,
表示匹配数没有上限或下限(即下限为0,上限为无穷大)
5
正好是 4
大多数好的语言都包含缩写,RegEx 也是如此:
+
是 1,
的简写
*
是 ,
的简写
?
是 ,1
的简写
这意味着+
需要至少 1 个匹配项,而 *
接受任意数量的匹配项或根本不接受匹配项,?
接受不超过 1 个匹配项或零个匹配项。
来源:Codecademy.com
【讨论】:
【参考方案7】:+
是最小的一,*
也可以是零。
【讨论】:
"+ is minimal one"
这句话是什么意思?
我发现这些“定义”具有误导性。【参考方案8】:
星号与加号非常相似,唯一的区别是加号匹配前面字符/组的 1 个或多个,而星号匹配 0 个或多个。
【讨论】:
【参考方案9】:我认为前面的答案未能突出一个简单的例子:
例如我们有一个数组:
numbers = [5, 15]
以下正则表达式 ^[0-9]+
仅匹配:15
。
但是,^[0-9]*
匹配 5 and 15
。不同之处在于+
运算符需要至少一个 duplicate 前面的正则表达式
【讨论】:
嗯,什么?!?为什么这个答案完全被忽略了?这是完全不正确的。这两种模式肯定会匹配字符串5
和15
。以上是关于正则表达式加与星号的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章