正则表达式加与星号的区别? [复制]

Posted

技术标签:

【中文标题】正则表达式加与星号的区别? [复制]【英文标题】:Regex plus vs star difference? [duplicate] 【发布时间】:2022-01-17 22:19:10 【问题描述】:

有什么区别:

(.+?)

(.*?)

当我在我的 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(.+?)(.+?)ba(.+?)ba(.*?)(.*?)ba(.*?)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 表示“在 if 之间匹配”。我们来看看下面的例子:

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 前面的正则表达式

【讨论】:

嗯,什么?!?为什么这个答案完全被忽略了?这是完全不正确的。这两种模式肯定会匹配字符串515

以上是关于正则表达式加与星号的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式量词加号和星号之间的区别

仅当两者之间存在某些文本时,正则表达式才匹配星号

使用正则表达式删除星号和空行

利用正则表达式实现手机号码中间4位用星号(*)

Pyhton 爬虫正则表达式

在正则表达式中使用 '\s' 和实际空格之间的区别? [复制]