在Java Pattern
类中,不允许单独使用量词的表达式(如+
)或附加量词的表达式,如a++++
,并且这两种情况都会引发异常(因为挂起的元字符)。然而,Pattern
类允许单独使用区间量词({1}
,{2,6}
),这将匹配字符之间的空格。区间中的更多数字并不重要,所以{1}
和{99999}
会匹配相似,这可能是合理的(因为无限的"无"可以放在同一空间中),但可能会产生误导。有效的正则表达式,如:
a{2}
a{2}{34}{9999,99999}
a{2}{45}
a{2}+{234}+{9,999999999}?
是有效的模式,并且将完全匹配。所以实际上这是一个无用的功能。
据我所知,在大多数regex风格中,除了Ruby之外,不允许使用interval。这两种类型的量词被同等对待,并且必须在前面加上可量化元素才能创建有效的模式。
Pattern
类中这样的解决方案背后的原因是什么?这只是一个bug吗?发动机差异?为什么对待一个音程与其他量词不同?
原因是Java开发人员弄错了;没有理由不像对待其他量词那样对待区间。我检查了一下,自从jdk1.4第一次添加正则表达式以来就一直是这样。所以这不是回归,但我称之为bug。什么都不量化有什么意义?
我不喜欢Ruby的做法,将a{2}{3}
视为两个'a',三次(与(?:a{2}){3}
相同),但至少这是有道理的,而且它有先例:GNUERE(egrp、awk、emacs)也以同样的方式工作。
顺便说一下,a{2}+
是有效的——很傻,但有效。我所知道的每一种支持所有格量词的风格都允许它,尽管它是毫无意义的。与不情愿的修饰符(a{2}?
)一样,不允许非变量量词使用它和允许它一样令人困惑,所以他们选择了更容易支持的选项。
但{234}+{9,999999999}?
只是个异类。让我大吃一惊的是,它实际上是用Java编译的。