"Empty" Java 模式中的区间量词 class

"Empty" interval quantifiers in Java Pattern class

在JavaPatternclass中,不允许单独带量词的表达式,如+或附加量词,如a++++,两者都不允许cases 会抛出一个异常(因为悬挂的元字符)。但是 Pattern class 允许单独使用区间量词 ({1},{2,6}),它将匹配字符之间的空 spaces。间隔中的更多数字无关紧要,因此 {1}{99999} 将匹配得相似,这可能是合理的(因为无限 "nothing" 可以适合相同的 space),但可能会产生误导。实际上正则表达式如:

a{2}
a{2}{34}{9999,99999}
a{2}{45}
a{2}+{234}+{9,999999999}?

是有效的模式,并且将完全匹配。所以实际上这是一个无用的功能。

据我所知,在大多数正则表达式中,除了 Ruby 之外,不允许这样使用间隔。两种类型的量词被同等对待,并且必须在可量化元素之前创建有效模式。


Patternclass这样的解决方案背后的原因是什么? 这只是一个错误吗?发动机区别?为什么以不同于其他量词的方式对待区间?

原因是Java开发者弄错了;没有理由不像对待其他量词那样对待区间。我查了一下,从jdk1.4开始就是这样,刚开始加正则表达式的时候。所以这不是回归,但我会称之为错误。什么都不量化有什么意义?

我不喜欢 Ruby 所做的事情,将 a{2}{3} 视为 两个 'a',三次 (与 (?:a{2}){3}),但至少这是有道理的,而且它有先例:GNU ERE(egrep、awk、emacs)以同样的方式工作。

顺便说一下,a{2}+ 是有效的——虽然愚蠢,但有效。我所知道的每一种支持所有格量​​词的风格都允许它,尽管它毫无意义。与不情愿的修饰符 (a{2}?) 相同,对于非变量量词不允许它与允许它一样令人困惑,因此他们选择了更容易支持的选项。

但是 {234}+{9,999999999}? 太糟糕了。令我震惊的是,它实际上是在 Java.

中编译的