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



在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编译的。

相关内容

  • 没有找到相关文章

最新更新