在回溯和失败之后动作的动词
我最近正在阅读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
)