Java Pattern 类中的“空”间隔量词

Posted

技术标签:

【中文标题】Java Pattern 类中的“空”间隔量词【英文标题】:"Empty" interval quantifiers in Java Pattern class 【发布时间】:2016-04-03 08:51:16 【问题描述】:

在Java Pattern 类中,不允许使用单独的量词,如+ 或附加量词,如a++++,这两种情况都会抛出异常(因为悬空元字符)。但是Pattern 类允许单独使用间隔量词(1,2,6),它将匹配字符之间的空格。间隔中的更多数字无关紧要,因此199999 将匹配,这可能是合理的(因为无限的“无”可能适合相同的空间),但可能会产生误导。实际上正则表达式如:

a2
a2349999,99999
a245
a2+234+9,999999999?

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

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

Pattern 类中的这种解决方案背后的原因是什么? 这只是一个错误吗?发动机区别?为什么要区别对待区间和其他量词?

【问题讨论】:

【参考方案1】:

原因是 Java 开发人员弄错了;没有理由不像其他量词一样对待间隔。我查了一下,自从 jdk1.4 第一次添加正则表达式以来就是这样。所以这不是回归,但我会称之为错误。什么都不量化有什么意义?

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

顺便说一句,a2+ 是有效的——很傻,但是有效。我所知道的支持所有格量​​词的每一种风格都允许它,尽管它毫无意义。与不情愿的修饰符 (a2?) 相同,禁止它用于非变量量词与允许它一样令人困惑,因此他们选择了更容易支持的选项。

但是234+9,999999999? 实在是太糟糕了。让我大吃一惊的是,它实际上是用 Java 编译的。

【讨论】:

以上是关于Java Pattern 类中的“空”间隔量词的主要内容,如果未能解决你的问题,请参考以下文章

Java单体应用 - 架构模式 - 03.设计模式-22.空对象模式

大家好,帮我理解一下下面的几个java里的正则表达式的意思?在java的Pattern类里出来的

使用 Coq 证明存在量词

Pattern 类中的 pattern() 与 toString()

Java Pattern的用法是啥

LeetCode算法题-Word Pattern(Java实现)