示例:
/(?:美孚){0}酒吧/
我在另一个答案中看到了类似的东西。起初我想“应该是什么”,然后,“好的可能有意义,有点负面看”,所以Foo
之前不允许bar
,但这不起作用
您可以看到here on Regexr:它仅与bar
匹配,但也与bar
中的Foobar
匹配。
当我为行的开头添加锚点时:
/^(?:Foo){0}bar/
它表现得像我期待的那样。它仅匹配bar
中的bar
而非Foobar
。
但这与我仅使用/bar/
或/^bar/
的行为完全相同。
量词{0}
只是一种无用的副作用,还是真的有用的行为?
答案 0 :(得分:11)
{0}
有好用法。它允许您定义目前不打算捕获的组。在某些情况下,这可能很有用:
最好的一个 - 在递归正则表达式(或其他奇怪的结构)中使用该组。例如,Perl具有(?(DEFINE) )
用于相同的用途
一个简单的例子 - 在PHP中,这将匹配barFoo
(working 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
等。