Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“空的”;Java模式类中的区间量词_Java_Regex_Quantifiers - Fatal编程技术网

&引用;“空的”;Java模式类中的区间量词

&引用;“空的”;Java模式类中的区间量词,java,regex,quantifiers,Java,Regex,Quantifiers,在Java模式类中,不允许单独使用量词的表达式,如++或附加量词,如a++++,并且这两种情况都会引发异常(因为存在悬空的元字符)。然而,模式类允许单独使用区间量词({1},{2,6}),它将匹配字符之间的空格。间隔中的更多数字并不重要,因此{1}和{99999}将相似地匹配,这可能是合理的(因为无限“nothing”可能适合同一个空间),但可能会产生误导。实际上,正则表达式类似于: a{2} a{2}{34}{9999,99999} a{2}{45} a{2}+{234}+{9,9999999

在Java
模式
类中,不允许单独使用量词的表达式,如
++
或附加量词,如
a++++
,并且这两种情况都会引发异常(因为存在悬空的元字符)。然而,
模式
类允许单独使用区间量词(
{1}
{2,6}
),它将匹配字符之间的空格。间隔中的更多数字并不重要,因此
{1}
{99999}
将相似地匹配,这可能是合理的(因为无限“nothing”可能适合同一个空间),但可能会产生误导。实际上,正则表达式类似于:

a{2}
a{2}{34}{9999,99999}
a{2}{45}
a{2}+{234}+{9,999999999}?
是有效的模式,并且将完全匹配相同的模式。因此,实际上这是一个无用的功能

就我所知,在大多数regex风格中,除了Ruby之外,都不允许使用interval。这两种类型的量词被同等对待,并且必须在前面加上quantifiable元素才能创建有效的模式


模式
类中,这种解决方案背后的原因是什么?
只是一只虫子吗?引擎差异?为什么对待区间与其他量词不同?

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

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

顺便说一句,
a{2}+
是有效的——愚蠢,但有效。我所知道的每一种支持所有格量词的味道都允许它,尽管它毫无意义。与不情愿的修饰符(
a{2}?
)一样,不允许非变量量词使用它和允许它一样容易混淆,因此他们选择了更容易支持的选项

但是
{234}+{9999999999}?
就是这样。这让我大吃一惊,因为它实际上是用Java编译的