gpt4 book ai didi

regex - 在回溯和失败后起作用的动词

转载 作者:行者123 更新时间:2023-12-03 10:40:24 26 4
gpt4 key购买 nike

我最近在阅读 PCRE -(Perl 兼容的正则表达式)文档并发现了一些有趣的正则表达式技巧。当我继续阅读并筋疲力尽时,我因与使用一些 (*...) 相关的一些困惑而停了下来。模式。
我的问题和困惑与 (*PRUNE) 有关和 (*FAIL)现供引用 (*SKIP)就像 (*PRUNE) ,除了如果模式未 anchor 定,则颠簸前进不是到下一个字符,而是到 职位在主题中(*SKIP)遇到了。
文档指出 (*PRUNE)导致匹配在当前 处失败起始位置 如果模式的其余部分不匹配,则在主题中。它说 (*FAIL)同义词 (?!)否定断言。在 强制匹配失败给定位置在图案中。
所以基本上(*FAIL)表现得像一个失败的否定断言,是 (?!) 的同义词
(*PRUNE)导致匹配在当前 处失败起始位置 如果稍后匹配失败导致回溯到达它,则在主题中。

How are these different when it comes to a point of failing?

Can anyone provide examples of how these are implemented and used correctly?

最佳答案

在阅读此答案之前,您应该熟悉回溯机制、原子组和所有格量词。您可以在 Friedl 书中找到有关这些概念和功能的信息,并访问以下链接:www.regular-expressions.info , www.rexegg.com
所有的测试都是通过全局搜索进行的(使用 preg_match_all() 函数)。(*FAIL) (或简写 (*F) )

baabo caaco daado

caac(*FAIL)|aa.|caaco|co

[0] => aab
[1] => caaco
[2] => aad
(*FAIL)导致与模式中的“坏字符”完全相同的行为。例如,如果将其替换为“R”,则会得到完全相同的结果: caacR|aa.|caaco|co .更笼统地说,你确实可以替换 (*FAIL)具有“始终失败的子模式”,例如: (?!) , (?=a(?<!a)) ,... a (first from "baabo") : 不出意外,第一个结果是由第二个选择找到的。 ( aab ) c (first) :正则表达式引擎遇到第一个“c”并尝试第一个选择并找到: caac ,但子模式被迫失败。然后正则表达式引擎(总是从第一个“c”开始)尝试失败的第二个选择,第三个选择成功。 ( caaco ) a (first from "daado") : 第三个结果由第二个选择找到。 ( aad ) (*SKIP)
baabo caaco daado

caa(*SKIP)c(*FAIL)|aa.|caaco|co

[0] => aab
[1] => co
[2] => aad
这个动词定义了一个点,当子模式稍后失败时,正则表达式引擎不允许回溯。因此, 使用子模式之前找到的所有字符都将一劳永逸地消耗掉 , 并且不能用于模式的另一部分(替代)。 a (first from "baabo") :第一个结果由第二个选择找到。 ( aab ) c (first) :正则表达式引擎找到 caac与第一种情况一样,然后失败(由于 (*FAIL) 动词),回溯到第二个“c”,但不允许回溯到 (*SKIP) 之前先前匹配的字符(“caa”)动词。 c (second) :现在,正则表达式引擎总是尝试第一个选择,但在这个新位置并失败,因为后面有一个“o”而不是“a”,然后它回溯到第二个“c”。请注意,在这种情况下,这些字符不会像以前一样被消耗,因为子模式在到达 (*SKIP) 之前失败了。动词。
第二种选择经过测试并失败(不以“c”开头)。第三种选择也失败了,因为下一个字符是“o”而不是“a”。
第四个选择成功并给出第二个结果。 ( co ) a (first from "daado") : 第三个结果由第二个选择找到。 ( aad )
(*PRUNE)
baabo caaco daado

caa(*PRUNE)c(*FAIL)|aa.|caaco|co

[0] => aab
[1] => aac
[2] => aad
这个动词不同于 (*SKIP)因为它不禁止使用所有先前匹配的字符,而是在子模式稍后失败时跳过子模式的第一个匹配字符(或禁止子模式开始)。 a (first from "baabo") :第一个结果由第二个选择找到。 ( aab ) c (first) :正则表达式引擎找到 caac与第一种情况一样,然后失败,但现在从“caaco”回溯到第一个“a”,因为第一个“c”被跳过。 a (first from "caaco") :第一个选择被尝试并失败,第二个成功并给出第二个结果。 ( aac ) a (first from "daado") : 第三个结果由第二个选择找到。 ( aad )

关于regex - 在回溯和失败后起作用的动词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992984/

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