在某些情况下,量词{0}是否有意义?

时间:2011-09-22 08:10:50

标签: regex

示例:

/(?:美孚){0}酒吧/

我在另一个答案中看到了类似的东西。起初我想“应该是什么”,然后,“好的可能有意义,有点负面看”,所以Foo之前不允许bar,但这不起作用

您可以看到here on Regexr:它仅与bar匹配,但也与bar中的Foobar匹配。
当我为行的开头添加锚点时:

/^(?:Foo){0}bar/

它表现得像我期待的那样。它仅匹配bar中的bar而非Foobar

但这与我仅使用/bar//^bar/的行为完全相同。

量词{0}只是一种无用的副作用,还是真的有用的行为?

4 个答案:

答案 0 :(得分:11)

{0}用法。它允许您定义目前不打算捕获的组。在某些情况下,这可能很有用:

  • 最好的一个 - 在递归正则表达式(或其他奇怪的结构)中使用该组。例如,Perl具有(?(DEFINE) )用于相同的用途 一个简单的例子 - 在PHP中,这将匹配barFooworking example):

    preg_match("/(?:(Foo)){0}bar(?1)/", "barFoo", $matches);
    
  • 将失败的捕获组(已命名或编号)添加到结果匹配。

  • 在重构模式的情况下保持所有组的索引完整。

不太好的用途,正如彼得所建议的那样有用:

  • 生成的模式。
  • 可读性 - 具有特定重复的模式,其中{0}{1}可能会引导思维朝着正确的方向发展。 (好的,不是最好的一点)

这些都是罕见的情况,在大多数模式中都是错误的。

答案 1 :(得分:3)

显式重复计数为零在自动生成的正则表达式中很有用。你可以避免以这种方式为零重复编码特殊情况。

答案 2 :(得分:2)

在传统的正则表达式中,/x{0}/(language = {x n :x = 0})意味着“完全匹配x的0”,这与{{ 1}}(语言= {Λ})。由于这两者是等效的,因此您应该能够移除任何您发现的//

但PCRE和正则表达式的其他扩展可以得到相当的拜占庭式。如果/x{0}/在Perl中做了什么,我不会感到惊讶。我会反感,但并不感到惊讶。

我认为这可能是程序的一些工件,它会自动生成正则表达式,但不会简化它们。这是一种耻辱,因为编写简化正则表达式的程序非常容易。

答案 3 :(得分:2)

我无法想到使用x{0}的一个好理由。但我可以想到几个应该避免的原因:

  • 因为它始终匹配所以没用。
  • 它会降低正则表达式引擎的速度(除非预编译正则表达式)。
  • 这可能是正则表达者作者误解的一个标志。

我愿意打赌,写(?:foo){0}的人尝试说“确保foo在这里不匹配”,这当然会失败,因为无论foo是否存在,空字符串始终可以匹配。这就是负面的外观断言。 (?<!foo)bar等。