`{m}`和`{m}?`量词之间有什么区别吗?

时间:2012-12-03 23:00:59

标签: regex quantifiers

请举例说明可以看到贪婪和懒惰版本的“repeat-exact-m-times”量词之间的区别。
问题来自herehere 如果没有差异,那么{m}?量词的存在是什么?

3 个答案:

答案 0 :(得分:3)

我不相信{m}{m}?之间存在任何真正的区别,因为每个都指定了m次。但是,{m,}{m,}?(和{m,}+之间存在差异,而我们就是这样。一般来说,量词是合适的,即使对于那个特定情况不需要也是如此。

答案 1 :(得分:2)

如评论中所述,Oniguruma regexp引擎对它的处理方式不同,例外:{m}?不是非贪婪的精确m(与贪婪的精确m相同),但是0或m。我试过的所有其他引擎都像其他海报一样说:它没有任何区别。

存在非贪婪的确切m的原因:如果不存在,则是例外。例外更难记住,更难实现 - 这是额外的工作,在这种情况下,由于语义相同,它不会伤害任何人。

我喜欢Oniguruma,并且感谢他们可能想要将不需要的位更改为更有用和更有效的东西,但这看起来像是一个等待发生的错误。幸运的是,没有人的理智写出非贪婪的确切... ...

答案 2 :(得分:1)

完全匹配{m}没有区别。

然而,与{m,}有所不同,因为贪婪的限定符匹配尽可能多的字符,而惰性限定符尽可能少匹配。


给定字符串"Baaaaaaaaaaaa"

正则表达式(B[a]{2,}?)将匹配"Baa"

正则表达式(B[a]{2,})将匹配"Baaaaaaaaaaaa"


然而,完全匹配{m}

正则表达式(B[a]{2}?)将匹配"Baa"

正则表达式(B[a]{2})也匹配"Baa"