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
),它将匹配字符之间的空格。间隔中的更多数字无关紧要,因此1
和99999
将匹配,这可能是合理的(因为无限的“无”可能适合相同的空间),但可能会产生误导。实际上正则表达式如:
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类里出来的