【问题标题】:Does the quantifier {0} make sense in some scenarios?量词 {0} 在某些情况下是否有意义?
【发布时间】:2011-11-22 14:52:48
【问题描述】:

例子:

/(?:Foo){0}bar/

我在另一个答案中看到了类似的东西。起初我想“那应该是什么”,但后来,“OK 可以说得通,有点消极”,所以Foobar 之前是不允许的,但这是行不通的。

你可以看到这个here on Regexr:它只匹配bar,但它也匹配Foobar中的bar
当我为行的开头添加一个锚点时:

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

它的行为与我预期的一样。它只匹配bar 而不是Foobar 中的bar

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

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

【问题讨论】:

    标签: regex


    【解决方案1】:

    在传统的正则表达式中,/x{0}/ (language = { xn : x = 0}) 表示“恰好匹配 x 的 0”,这与 // (语言 = { Λ })。由于两者是等价的,您应该能够删除您发现的任何/x{0}/

    但是 PCRE 和正则表达式的其他扩展可能会变得非常拜占庭式。如果/x{0}/ 在 Perl 中做了什么,我不会感到惊讶。我会感到厌恶,但并不感到惊讶。

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

    【讨论】:

    • “我会感到厌恶,但并不感到惊讶。” :)
    • 编写简化正则表达式的程序真的那么容易吗?听起来很有趣……
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我想不出一个使用x{0} 的好理由。但我能想到几个为什么应该避免它:

      • 它没用,因为它总是匹配。
      • 它会降低正则表达式引擎的速度(除非预编译了正则表达式)。
      • 这可能是正则表达式作者误解的迹象。

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

      【讨论】:

        【解决方案4】:

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

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

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

        • 保持所有组的索引不变,以防模式被重构。

        彼得建议的不太好的用途:

        • 生成的模式。
        • 可读性 - 具有某些重复的模式,其中{0}{1} 可能会引导思考正确的方向。 (好吧,不是最好的点)

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

        【讨论】:

        • 太棒了,科比。这仅在具有子例程但没有 (?(DEFINE)) 的引擎中有用,我认为这只是 Ruby,可能是带有 regex 模块的 Python。用 Ruby 测试:(?:(Foo)){0}bar\g<1> +1000!
        • 如果有人感兴趣,请不要在 Python 中使用 regex 模块。但是想出了这个可行的替代方案:(?:(Foo)$^)?bar(?1)
        猜你喜欢
        • 2018-04-13
        • 2022-10-06
        • 2015-09-15
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多