2011-09-22 89 views
11

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

/(?:富){0}酒吧/

我看到这样的事情在另一个答案。起初我认为“应该是什么”,但是,“好的可能有意义,有点负面的背后”,所以在bar之前不允许Foo,但这是行不通的。

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

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

它像我期望的那样。它仅匹配bar而不匹配Foobar中的bar

但是,这是完全一样的行为,如果我只使用/bar//^bar/

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

回答

11

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

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

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

  • 在模式被重构的情况下保持所有组的指数不变。

少好用途,彼得建议是有用的:

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

这些都是罕见的情况,在大多数情况下,这是一个错误。

+0

这真棒,Kobi。这只适用于具有子例程但不包含'(?(DEFINE))'的引擎,我认为这只是Ruby,可能还有带'regex'模块的Python。在Ruby中测试:'(?:(Foo)){0} bar \ g <1>'+1000! – zx81

+1

如果有人感兴趣,不要使用'regex'模块在Python中工作。但想出了这个替代方案,它的作用:'(?:(Foo)$ ^)?bar(?1)' – zx81

2

在传统的正则表达式,/x{0}/(语言= {X Ñ:X = 0})将意味着 “匹配x的准确0”,这是同样的事情//(语言= {Λ})。由于这两者是相同的,因此您应该能够删除您发现的任何/x{0}/

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

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

+0

_“我会反感,但不会感到惊讶。”_ :) –

+0

编写简化正则表达式的程序真的很容易吗?这听起来很有趣...... – Kobi

3

在自动生成的正则表达式中,显式重复计数为零可能很有用。您避免使用这种方法为零重复编码一个特殊情况。

2

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

  • 它是无用的,因为它总是匹配。
  • 它减慢了正则表达式引擎的速度(除非正则表达式是预编译的)。
  • 这可能是正则表达式作者误解的标志。

我敢打赌,有人谁写(?:foo){0}试图说“确保foo不匹配这里”,这当然是失败,因为空字符串总是可以匹配,是否foo有没有。这就是负面的观察断言。 (?<!foo)bar

相关问题