"是什么意思?-6ren"> "是什么意思?-我似乎无法弄清楚 ?> 在正则表达式中的用途。例如,以下内容: (?>[^()]+) 我知道 ?: 意味着如果您不打算向后引用匹配项,则不应存储该匹配项。这有什么关系吗? 这是否也与正则表达式有关? -6ren">
gpt4 book ai didi

php - PCRE 正则表达式中的 "?>"是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 12:33:39 27 4
gpt4 key购买 nike

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

(?>[^()]+)

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

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

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

最佳答案

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

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

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

正常版本,在尝试 (a + b for ^\([^()]+ 并且无法匹配文字 ) 之后将回溯一个字符并使用 (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 中那样出现堆栈溢出,但在验证长字符串时性能应该会更好。

关于php - PCRE 正则表达式中的 "?>"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com