什么是> >在一个PCRE正则表达式中的平均值


What does "?>" mean in a PCRE regex?

我似乎弄不清楚?>在正则表达式中用于什么。例如:

(?>[^()]+)

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

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

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

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

表达式(?>[^()]+)不需要单独设置为非回溯。没有任何东西可以诱导回溯显示非回溯行为。

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

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

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

非回溯组主要用于减少由量词(?, *, +, {n,}, {n,m})引起的回溯。使用非回溯组进行优化的技巧是知道regex引擎的第一次尝试。你可能需要移动正则表达式,以确保引擎所做的第一次尝试是你想要匹配的-然后它可以被设置为非回溯。

作为非回溯组优化的一个例子:

  • 如何提高。net正则表达式的性能?

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

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

  • 使用RegEx匹配大输入时出现StackOverflowError

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

    在PHP中你不会像在Java中那样得到堆栈溢出,但是当你验证一个长字符串时,性能应该会更好。