Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候应该使用regex回溯控件,比如(*PRUNE)?_Regex_Perl_Backtracking - Fatal编程技术网

什么时候应该使用regex回溯控件,比如(*PRUNE)?

什么时候应该使用regex回溯控件,比如(*PRUNE)?,regex,perl,backtracking,Regex,Perl,Backtracking,一些正则表达式引擎支持回溯相关的动词:(*PRUNE),(*SKIP),(?{doSomeCode();})*,等等。我已经从 我倾向于认为这些动词有点深奥,或者至少是向更低级的编程类型迈出了不必要的一步。与其需要(*PRUNE),不如在幕后(比如在编译器或引擎中)进行更多优化(降低正则表达式编写器/程序员和读者的复杂性) 那么,在实践中,在正则表达式中包含回溯相关动词在什么情况下是有用的呢?这样做有什么好处吗 *虽然从技术上讲不是回溯控制动词,但许多在正则表达式中执行任意代码的示例都以影响回

一些正则表达式引擎支持回溯相关的动词:
(*PRUNE)
(*SKIP)
(?{doSomeCode();})
*,等等。我已经从

我倾向于认为这些动词有点深奥,或者至少是向更低级的编程类型迈出了不必要的一步。与其需要
(*PRUNE)
,不如在幕后(比如在编译器或引擎中)进行更多优化(降低正则表达式编写器/程序员和读者的复杂性)

那么,在实践中,在正则表达式中包含回溯相关动词在什么情况下是有用的呢?这样做有什么好处吗


*
虽然从技术上讲不是回溯控制动词,但许多在正则表达式中执行任意代码的示例都以影响回溯或受回溯影响的方式执行


背景

这些特征最初是实验性的,但在中不再标记为实验性的。难怪我在互联网上找不到关于这些结构的更多信息(特别是当搜索被不相关的结果阻塞时,这些结果在代码之外有
skip
prune
)。我敢打赌,有很多人在正则表达式方面有足够的知识来使用这些动词,但他们根本不知道这些动词

因此,有许多实际障碍阻碍了广泛使用:

  • 特征是实验性的
  • 特征是模糊的
  • 功能是先进的
  • 试图找到一个超越这一点的答案,并从创建这些特性的开发人员那里找到一个好的用例或推理

    我也知道存在类似的问题,但它没有回答我的问题,因为对该问题说“是”的唯一答案给出了两个链接,其中一个是深奥的用法(此外,我无法理解它…)。另一个,虽然它给出了何时使用
    (*FAIL)
    ,但没有解决我提到的任何其他构造,也没有使用
    (*FAIL)
    作为回溯机制。据我所知,
    (*FAIL)
    可以被模拟

    让我在回答中重新说明我在寻找什么:

    • 特别与回溯相关
    • 非深奥的
    • 实用的
    • 不仅仅是一个用法的例子
    • 对给出的任何例子都有解释吗
    • 可能包括添加功能原因的背景信息
    • 可能包括与功能的未来相关的更新(以Perl或其他regex风格)

    您可以查看的一个很好的文档是。特别是
    指令似乎与
    (*PRUNE)
    (尽管也有一个
    (*COMMIT)
    )相关,并包含一个具有指导意义的示例


    我个人的印象是,大多数情况下,他们为您提供工具,使您的正则表达式更好(例如,性能更高或更清晰),但不一定更有效。举个例子,你可能没有
    (*PRUNE)
    ,但你会遭受更重的回溯,而这对你的影响取决于你试图匹配什么。对于
    (*FAIL)
    ,可能会使用不匹配的子正则表达式来模拟它,但更清楚的是,它的目的是至少提高可读性。

    简言之:您将知道是否需要使用它们,如果不确定,就不要使用它们


    正如其他人所提到的,这些工具往往是适合语法处理的基于性能的优化工具。过早优化不仅是万恶之源,这些特性直到最近才被标记为实验性的。因此,我们可以合理地推断,它们对于大多数用例来说都不是必需的,除非必要,否则最好不要去借用麻烦/复杂性。

    我不明白这个问题的可能重复(“那么,在实践中,在正则表达式中包含回溯相关动词在什么情况下有用?”)与链接的不同,正确地结束了一个问题(“您在正则表达式中使用了Perl 5.10回溯控制动词吗?它们帮助您[解决]了哪些问题?”)@miken32我更新了我的问题,更详细地解释了为什么它没有回答这个问题。现在清楚我所问的有什么不同了吗?我不是要举个例子,雷克赛格有一个。最常用的实用动词可能是。例如,假设您希望匹配
    is
    (如果不在括号内)。链接的材料使用Perl6正则表达式吗?我对Perl6正则表达式不是很熟悉,尽管它似乎更类似于BNF。(自从我最初问这个问题以来,我学到了很多东西,但我仍然不知道
    bless
    ,例如,在Perl中做了什么。)不,这个链接指的是一个Perl 5模块,它可以追溯到5.6.2——这个链接只是想给你一个例子,说明在什么情况下修剪搜索空间可能是有意义的。