我似乎弄不清楚?>
在正则表达式中用于什么。例如:
(?>[^()]+)
我知道?:
意味着它不应该存储匹配,如果你不打算反向引用匹配。这有什么联系吗?
这也与正则表达式有关吗?(?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中那样得到堆栈溢出,但是当你验证一个长字符串时,性能应该会更好。