10

我试图理解以下正则表达式量词(a在这里只是一个示例性标记):

a{n}?

问号如何影响上述表达式的匹配?它与以下有何不同?

a{n}

例如,我希望该模式与aa{1}?a两者都匹配。虽然匹配,但不是匹配。该模式确实匹配两者,因此括号在这里确实有所作为。aaaaaaaaaaa(a{1})?a


注意:msdn 文章Quantifiers in Regular Expressions说明了这两种情况:

{n} 量词恰好匹配前面的元素 n 次,其中 n 是任何整数。

对于{n}?,它添加了以下不太有用的部分:

它是贪婪量词 {n}+ 的惰性对应物。

4

2 回答 2

10

没什么。文章指出:

{n}量词恰好匹配前面的元素n,其中n是任何整数。{ n }是一个贪心量词,它的惰性等价物是{ n }?.

…</p>

{n}?量词精确匹配前面的元素n次,其中n是任何整数。它是贪婪量词{ n }+的惰性对应物。

请注意,文本完全相同。基本上,添加? 不会改变量词的行为。.NET 的正则表达式引擎似乎支持{n}?作为 .NET 的替代方案{n}


有趣的是,这篇文章似乎确实包含一个错误:

{ n ,}量词至少匹配前面的元素n,其中n是任何整数。{ n, }是一个贪心量词,它的惰性等价物是{ n }?.

这是错误的。{n,}is的惰性等价{n,}?{n}?.

更新:文章的较新版本已更正此错误。

于 2013-08-01T23:32:07.940 回答
1

更多的是通知而不是答案,但很高兴知道,特别是如果您计划在不同语言中使用相同的模式,或者如果您决定将其他正则表达式库与 .net 一起使用。

关于:

例如,我希望该模式与aa{1}?a两者都匹配。虽然匹配,但不是匹配。aaaaaaaaaa

a{n}a{n}?产生与大多数正则表达式引擎相同的结果(被视为贪婪和非贪婪版本,但具有固定量词)。

但Oniguruma 和 Onigmo 正则表达式引擎并非如此。与他们a{n}?的行为类似(?:a{n})?。由于这些库存在 .net 的包装器,因此澄清一下很有用。

与 sed、grep 和 dbms 中使用的 ERE(扩展正则表达式)相同。

于 2013-08-01T23:05:30.317 回答