【问题标题】:What does "?>" mean in a PCRE regex?“?>”在 PCRE 正则表达式中是什么意思?
【发布时间】:2013-03-14 15:34:47
【问题描述】:

我似乎无法弄清楚?> 在正则表达式中的用途。例如:

(?>[^()]+)

我知道?: 意味着如果您不打算反向引用匹配,它不应该存储匹配。这有什么关系吗?

这也与正则表达式有关吗? (?P>name)(?&name)

来源:http://php.net/manual/en/regexp.reference.recursive.php

【问题讨论】:

  • 或“原子分组”:regular-expressions.info/atomic.html
  • +1 通常很难找到简单而全面的正则表达式文档,更不用说在搜索引擎中包含正则表达式语法了。
  • @caiosm1005,我推荐 Perl 的正则表达式文档。它是一个页面(很容易在浏览器中搜索奇怪的表达式),它是几乎所有正则表达式引擎所基于的标准。它确实有一些仅限 Perl 的特性(主要在“扩展模式”下),但它是一个很好的起点。 perldoc.perl.org/perlre.html
  • @dan1111 谢谢,我还不知道那个网站。我总是用谷歌搜索我的“正则表达式问题”,我通常会在 php.net、SO 或 regular-expressions.info 中找到。但这是一个真正有用的网站。能够在几秒钟内找到相关部分。

标签: php regex


【解决方案1】:

(?>pattern) 防止在pattern 上回溯。它至少有 2 个名称:非回溯组原子组。我将其称为非回溯组,因为它是最具描述性的名称。

不过,单独的表达式(?>[^()]+) 不需要设为非回溯。没有什么可以诱导回溯以显示非回溯行为。

一个更有趣的例子是正则表达式^\((?>[^()]+)\),匹配字符串(a + b(),与没有非回溯组^\([^()]+\)的普通版本进行比较。

正常版本,在尝试(a + b^\([^()]+ 并且未能匹配文字) 后将回溯一个字符并使用(a + 重试,等等,直到(a,在用尽所有可能性后失败.

非回溯版本将在第一次尝试(a + b 后立即失败。

非回溯组主要用于减少量词引起的回溯(?*+{n,}{n,m})。使用非回溯组进行优化的技巧是了解正则表达式引擎的第一次尝试。您可能需要改变正则表达式以确保引擎所做的第一次尝试是您想要匹配的 - 然后可以使其不回溯。

以非回溯组优化为例:

  • How can I improve the performance of a .NET regular expression?

    我引用的问题来自 .NET,但它对非回溯组使用相同的语法。

    在上面的问题中,原始正则表达式有很多*+ 量词的用法。当匹配失败时会导致不必要的回溯,从而影响大输入时的性能。

  • StackOverflowError when matching large input using RegEx

    另一个例子。注意占有量词(在普通量词后加+,如?+++*+等)和非回溯组具有非回溯的相同行为,只是非回溯组的语法允许它被泛化。

    在 PHP 中不会像在 Java 中那样出现堆栈溢出,但在验证长字符串时性能应该会更好。

【讨论】:

  • (a + b() 应该是(a + b)
  • @Decula:这是一个展示正则表达式如何无法匹配字符串的示例 - 它会立即与非回溯组一起失败,而普通的正则表达式需要在失败之前回溯。
  • @Decula 完全没有抓住重点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
相关资源
最近更新 更多