在回溯和失败之后动作的动词
我最近正在阅读PCRE (兼容Perl的正则expression式)文档,并用正则expression式来看一些有趣的技巧。 当我继续阅读和耗尽自己的时候,我停止了,因为使用一些(*...)模式的一些混淆。 
 我的疑问和困惑涉及(*PRUNE)和(*FAIL) 
 现在引用(*SKIP)行为就像(*PRUNE) ,只是如果模式是未锚定的,那么bumpalong的前进就不是到下一个字符,而是到了主体中遇到(*SKIP)的位置 。 
 如果模式的其余部分不匹配,则(*PRUNE)会导致匹配在主题中的当前起始位置失败。 它指出(*FAIL)与(?!)否定断言的同义词。 在模式中的给定位置强制匹配失败。 
 所以基本上(*FAIL)行为就像一个失败的否定断言,是(?!)的同义词(?!) 
 和(*PRUNE)导致匹配失败在主题的当前开始位置 ,如果有一个后来匹配失败,导致回溯到达它。 
在谈到失败的时候,这些有什么不同呢?
任何人都可以提供这些如何正确实施和使用的例子吗?
在阅读这个答案之前,你应该熟悉回溯机制,primefaces组和占有量词。 你可以在弗里德尔书中find关于这些概念和特征的信息,并可以通过以下链接find: http://www.regular-expressions.info , http://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 )