【发布时间】:2016-03-23 16:50:25
【问题描述】:
一些正则表达式引擎支持与回溯相关的动词:(*PRUNE)、(*SKIP)、(?{doSomeCode();})* 等。我已经知道这些动词的作用,来自Reference - What does this regex mean?。
我倾向于认为这些动词有些深奥,或者至少对于更底层的编程类型来说是不必要的步骤。与其需要(*PRUNE),不如在幕后进行更多优化(例如在编译器或引擎中)(降低正则表达式编写器/程序员和读取器的复杂性)?
那么,在实践中,在什么情况下在正则表达式中包含与回溯相关的动词是有用的?这样做有什么好处吗?
* 虽然在技术上不是回溯控制动词,但许多在正则表达式中执行任意代码的示例都以影响回溯或受回溯影响的方式执行此操作。
背景
这些功能最初是实验性的,尽管它们在 the Perl regex tutorial 中不再被标记。难怪我无法在 Internet 上找到很多关于这些结构的信息(尤其是当搜索被代码之外的 skip 或 prune 的不相关结果阻塞时)。我敢打赌,有很多人在正则表达式方面足够先进,可以使用这些根本不了解它们的动词。
因此存在许多阻碍广泛使用的实际障碍:
- 功能是实验性的
- 功能不明确
- 功能先进
试图找到一个超越这一点的答案并找到一个好的用例,或者从创建这些功能的开发人员那里找到推理。
我也知道存在类似的closed (too opinion-based) question,但它没有回答我的问题,因为对该问题说“是”的唯一答案给出了两个链接,其中一个是深奥的用途(另外,我不明白...)。另一个虽然给出了何时使用(*FAIL) 的情况,但没有解决我提到的任何其他构造,也没有使用(*FAIL) 作为回溯机制。据我了解,(*FAIL) 可以被any regex that always fails 模拟。
让我重新指定我在答案中寻找的内容:
- 与回溯特别相关
- 非深奥
- 实用
- 不仅仅是一个使用示例
- 对给出的任何示例都有解释
- 可能包括添加功能原因的背景信息
- 可能包括与未来功能相关的更新及来源(Perl 或其他正则表达式风格)
【问题讨论】:
-
我看不出这个问题(“那么,在什么情况下在正则表达式中包含与回溯相关的动词有用,实际上?”)与链接的不同,并且正确地关闭一(“你在你的正则表达式中使用过 Perl 5.10 回溯控制动词吗?它们帮助你[解决]了哪些问题?”)
-
@miken32 我更新了我的问题,更详细地解释了为什么它没有回答问题。现在是否清楚我的要求有何不同?我不是在问只是的例子。
-
Rexegg 有一个tutorial worth reading。最常用的实用动词可能是
(*SKIP)(*FAIL)or(*SKIP)(*F)together with this trick。例如,假设您想匹配is(如果不在括号内)。里面的内容可以是skipped by use of these verbs (demo)。
标签: regex perl backtracking