在回溯和失败之后动作的动词

我最近正在阅读PCRE (兼容Perl的正则expression式)文档,并用正则expression式来看一些有趣的技巧。 当我继续阅读和耗尽自己的时候,我停止了,因为使用一些(*...)模式的一些混淆。

我的疑问和困惑涉及(*PRUNE)(*FAIL)

现在引用(*SKIP)行为就像(*PRUNE) ,只是如果模式是未锚定的,那么bumpalong的前进就不是到下一个字符,而是到了主体中遇到(*SKIP)位置

如果模式的其余部分不匹配,则(*PRUNE)会导致匹配在主题中的当前起始位置失败。 它指出(*FAIL)(?!)否定断言的同义词。 在模式中的给定位置强制匹配失败。

所以基本上(*FAIL)行为就像一个失败的否定断言,是(?!)的同义词(?!)

(*PRUNE)导致匹配失败在主题的当前开始位置 ,如果有一个后来匹配失败,导致回溯到达它。

在谈到失败的时候,这些有什么不同呢?

任何人都可以提供这些如何正确实施和使用的例子吗?

在阅读这个答案之前,你应该熟悉回溯机制,primefaces组和占有量词。 你可以在弗里德尔书中find关于这些概念和特征的信息,并可以通过以下链接find: http://www.regular-expressions.infohttp://www.rexegg.com

所有的testing都是通过全局search(使用preg_match_all()函数)完成的。

(*失败)

 baabo caaco daado caac(*FAIL)|aa.|caaco|co [0] => aab [1] => caaco [2] => aad 

(*FAIL)导致与模式中的“坏字符”完全相同的行为。 如果用“R”代替它,则得到完全相同的结果: caacR|aa.|caaco|co 。 更一般地说,你可以通过一个“总是失败的子模式”replace(*FAIL) ,如: (?!)(?=a(?<!a))

a (first from "baabo") :毫不奇怪,第一个结果是由第二个替代方法find的。 ( aab

c (first) :正则expression式引擎遇到第一个“c”并尝试第一个替代方法并find: caac ,但子模式被强制失败。 然后,正则expression式引擎(总是从第一个“C”)尝试第二个替代失败,第三个替代scheme成功。 ( caaco

a (first from "daado") :第三个结果是由第二个替代方法find的。 ( aad

(*跳跃)

 baabo caaco daado caa(*SKIP)c(*FAIL)|aa.|caaco|co [0] => aab [1] => co [2] => aad 

这个动词定义了一个点,超过这个点后面的子模式失败时,不允许正则expression式引擎回溯。 结果, 所有在子模式中发现的字符都被一劳永逸地消耗掉 ,并且不能用于该模式的另一部分(替代)。

a (first from "baabo") :第一个结果是由第二个替代方法find的。 ( aab

c (first) :正则expression式引擎在第一种情况下查找caac ,然后失败(导致(*FAIL)谓词),回溯到第二个“c”,但不允许回溯到先前匹配的字符(“ caa“)在(*SKIP)动词之前。
c (second) :现在,正则expression式引擎总是尝试第一种select,但在这个新的位置,因为有一个“o”而不是“a”之后,然后回溯到这第二个“c”。 请注意,在这种情况下,这些字符不会像以前那样被使用,因为子模式在到达(*SKIP)谓词之前失败了。 第二种方法是testing失败(不是以“c”开头)。 第三种select也不成功,因为下一个字符是“o”而不是“a”。 第四个select成功并给出第二个结果。 ( co

a (first from "daado") :第三个结果是由第二个替代方法find的。 ( aad

(*修剪)

 baabo caaco daado caa(*PRUNE)c(*FAIL)|aa.|caaco|co [0] => aab [1] => aac [2] => aad 

这个动词与(*SKIP)不同,因为它不禁止使用所有先前匹配的字符,但是如果子模式稍后失败,则跳过子模式的第一个匹配的字符(或禁止以子模式开始)。

a (first from "baabo") :第一个结果是由第二个替代方法find的。 ( aab

c (first) :正则expression式引擎在第一种情况下查找caac ,然后失败,但是现在从“caaco”回溯到第一个“a”,因为第一个“c”被跳过。
a (first from "caaco") :第一个select被尝试失败,第二个select成功并得到第二个结果。 ( aac

a (first from "daado") :第三个结果是由第二个替代方法find的。 ( aad