量词{0}在某些情况下是否有意义?
/(?:富){0}酒吧/
我看到这样的事情在另一个答案。起初我认为“应该是什么”,但是,“好的可能有意义,有点负面的背后”,所以在bar
之前不允许Foo
,但这是行不通的。
你可以看到这个here on Regexr:它只匹配bar
,但它也匹配Foobar
中的bar
。
当我添加锚点该行的开始:
/^(?:Foo){0}bar/
它像我期望的那样。它仅匹配bar
而不匹配Foobar
中的bar
。
但是,这是完全一样的行为,如果我只使用/bar/
或/^bar/
。
量词{0}
只是无用的副作用,还是真的有一个有用的行为呢?
还有好用途{0}
。它允许您定义定义您目前不打算捕获的组。这在某些情况下可能会有用:
-
在递归正则表达式(或其他奇怪的构造)中使用组的最佳方法之一。例如,Perl对于相同的用途有
(?(DEFINE))
。
一个简单的例子 - 在PHP中,这将匹配barFoo
(working example):preg_match("/(?:(Foo)){0}bar(?1)/", "barFoo", $matches);
添加一个失败的捕获组(命名或编号)到结果的比赛。
- 在模式被重构的情况下保持所有组的指数不变。
少好用途,彼得建议是有用的:
- 生成模式。
- 可读性 - 有一定重复的模式,其中
{0}
和{1}
可能会导致思考的方向正确。 (好吧,不是最好的一点)
这些都是罕见的情况,在大多数情况下,这是一个错误。
在传统的正则表达式,/x{0}/
(语言= {X Ñ:X = 0})将意味着 “匹配x的准确0”,这是同样的事情//
(语言= {Λ})。由于这两者是相同的,因此您应该能够删除您发现的任何/x{0}/
。
但PCRE和正则表达式的其他扩展可以得到相当的拜占庭式。如果/x{0}/
在Perl中做了某些事情,我不会感到惊讶。我会感到厌恶,但并不感到惊讶。
我认为这可能是程序的某些工件自动生成正则表达式,但不会简化它们。这是一个耻辱,因为编写简化正则表达式的程序非常简单。
_“我会反感,但不会感到惊讶。”_ :) –
编写简化正则表达式的程序真的很容易吗?这听起来很有趣...... – Kobi
在自动生成的正则表达式中,显式重复计数为零可能很有用。您避免使用这种方法为零重复编码一个特殊情况。
我想不出一个很好的理由来使用x{0}
。但我可以想到几个为什么应该避免:
- 它是无用的,因为它总是匹配。
- 它减慢了正则表达式引擎的速度(除非正则表达式是预编译的)。
- 这可能是正则表达式作者误解的标志。
我敢打赌,有人谁写(?:foo){0}
是试图说“确保foo
不匹配这里”,这当然是失败,因为空字符串总是可以匹配,是否foo
有没有。这就是负面的观察断言。 (?<!foo)bar
等
这真棒,Kobi。这只适用于具有子例程但不包含'(?(DEFINE))'的引擎,我认为这只是Ruby,可能还有带'regex'模块的Python。在Ruby中测试:'(?:(Foo)){0} bar \ g '+1000! – zx81
如果有人感兴趣,不要使用'regex'模块在Python中工作。但想出了这个替代方案,它的作用:'(?:(Foo)$ ^)?bar(?1)' – zx81