【问题标题】:What is the difference between [0-9]+ and [0-9]++?[0-9]+ 和 [0-9]++ 有什么区别?
【发布时间】:2011-05-31 11:02:02
【问题描述】:

有人可以解释一下[0-9]+[0-9]++ 之间的区别吗?

【问题讨论】:

  • 这不是完全重复,但应该回答这个问题:stackoverflow.com/questions/4489551/…
  • 我从来没有听说过正则表达式中的++,而且似乎很多其他人也没有听说过,但是稍微挖掘一下确实表明它是有效的。
  • 不要在标题中写“已解决”。接受答案。
  • @user557108:请接受蒂姆的回答。

标签: php regex


【解决方案1】:

PHP 用于正则表达式的 PCRE 引擎支持"possessive quantifiers":

+ 后跟的量词是“占有”的。他们吃尽可能多的字符,并且不会返回以匹配模式的其余部分。因此.*abc 匹配"aabc".*+abc 不匹配,因为.*+ 吃掉了整个字符串。占有量词可用于加快处理速度。

还有:

如果设置了PCRE_UNGREEDY 选项(Perl 中没有该选项),那么量词默认情况下不是贪婪的,但是可以通过在它们后面加上问号来使单个量词变得贪婪。换句话说,它反转了默认行为。

区别在于:

/[0-9]+/  - one or more digits; greediness defined by the PCRE_UNGREEDY option
/[0-9]+?/ - one or more digits, but as few as possible (non-greedy)
/[0-9]++/ - one or more digits, but as many as possible (greedy, default)

This snippet 在默认贪婪模式下可视化差异。请注意,第一个 sn-p 在功能上与最后一个相同,因为默认情况下(在某种意义上)已经应用了附加的 +

This snippet 在应用 PCRE_UNGREEDY(默认模式下不贪婪)时可视化差异。看看默认值是如何反转的。

【讨论】:

  • 为什么这被否决了?该问题最初有一个php 标签。
  • @thirtydot:现在仍然如此。
  • 只是因为我加回来了:)
  • @user557108:不客气。并感谢 Spudley 为我们所有人提供了智慧。 :)
  • 对不起@Tomalak,但这个答案也是错误的。特别是,关于 PCRE_UNGREEDY 选项的内容完全是红鲱鱼。 PCRE_UNGREEDY 和所有格量词之间没有任何联系。占有量词与正常的贪婪量词和非贪婪量词根本不同。您从 PHP 文档中引用的描述比无用更糟糕; here's a better one.
【解决方案2】:

++(以及?+*+{n,m}+)被称为possessive quantifiers

[0-9]+[0-9]++ 都匹配一个或多个 ASCII 数字,但第二个将不允许正则表达式引擎回溯到匹配,如果这对于整个正则表达式成功是必要的。

例子:

[0-9]+0

匹配字符串00,而[0-9]++0不匹配。

在第一种情况下,[0-9]+ 首先匹配00,然后回溯一个字符以允许后面的0 匹配。在第二种情况下,++ 阻止了这种情况,因此整个匹配失败。

并非所有的正则表达式都支持这种语法;其他一些实现 atomic groups 代替(或什至两者)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2021-06-16
    相关资源
    最近更新 更多