"Empty" Java 模式中的区间量词 class
"Empty" interval quantifiers in Java Pattern class
在JavaPattern
class中,不允许单独带量词的表达式,如+
或附加量词,如a++++
,两者都不允许cases 会抛出一个异常(因为悬挂的元字符)。但是 Pattern
class 允许单独使用区间量词 ({1}
,{2,6}
),它将匹配字符之间的空 spaces。间隔中的更多数字无关紧要,因此 {1}
和 {99999}
将匹配得相似,这可能是合理的(因为无限 "nothing" 可以适合相同的 space),但可能会产生误导。实际上正则表达式如:
a{2}
a{2}{34}{9999,99999}
a{2}{45}
a{2}+{234}+{9,999999999}?
是有效的模式,并且将完全匹配。所以实际上这是一个无用的功能。
据我所知,在大多数正则表达式中,除了 Ruby 之外,不允许这样使用间隔。两种类型的量词被同等对待,并且必须在可量化元素之前创建有效模式。
Pattern
class这样的解决方案背后的原因是什么?
这只是一个错误吗?发动机区别?为什么以不同于其他量词的方式对待区间?
原因是Java开发者弄错了;没有理由不像对待其他量词那样对待区间。我查了一下,从jdk1.4开始就是这样,刚开始加正则表达式的时候。所以这不是回归,但我会称之为错误。什么都不量化有什么意义?
我不喜欢 Ruby 所做的事情,将 a{2}{3}
视为 两个 'a',三次 (与 (?:a{2}){3}
),但至少这是有道理的,而且它有先例:GNU ERE(egrep、awk、emacs)以同样的方式工作。
顺便说一下,a{2}+
是有效的——虽然愚蠢,但有效。我所知道的每一种支持所有格量词的风格都允许它,尽管它毫无意义。与不情愿的修饰符 (a{2}?
) 相同,对于非变量量词不允许它与允许它一样令人困惑,因此他们选择了更容易支持的选项。
但是 {234}+{9,999999999}?
太糟糕了。令我震惊的是,它实际上是在 Java.
中编译的
在JavaPattern
class中,不允许单独带量词的表达式,如+
或附加量词,如a++++
,两者都不允许cases 会抛出一个异常(因为悬挂的元字符)。但是 Pattern
class 允许单独使用区间量词 ({1}
,{2,6}
),它将匹配字符之间的空 spaces。间隔中的更多数字无关紧要,因此 {1}
和 {99999}
将匹配得相似,这可能是合理的(因为无限 "nothing" 可以适合相同的 space),但可能会产生误导。实际上正则表达式如:
a{2}
a{2}{34}{9999,99999}
a{2}{45}
a{2}+{234}+{9,999999999}?
是有效的模式,并且将完全匹配。所以实际上这是一个无用的功能。
据我所知,在大多数正则表达式中,除了 Ruby 之外,不允许这样使用间隔。两种类型的量词被同等对待,并且必须在可量化元素之前创建有效模式。
Pattern
class这样的解决方案背后的原因是什么?
这只是一个错误吗?发动机区别?为什么以不同于其他量词的方式对待区间?
原因是Java开发者弄错了;没有理由不像对待其他量词那样对待区间。我查了一下,从jdk1.4开始就是这样,刚开始加正则表达式的时候。所以这不是回归,但我会称之为错误。什么都不量化有什么意义?
我不喜欢 Ruby 所做的事情,将 a{2}{3}
视为 两个 'a',三次 (与 (?:a{2}){3}
),但至少这是有道理的,而且它有先例:GNU ERE(egrep、awk、emacs)以同样的方式工作。
顺便说一下,a{2}+
是有效的——虽然愚蠢,但有效。我所知道的每一种支持所有格量词的风格都允许它,尽管它毫无意义。与不情愿的修饰符 (a{2}?
) 相同,对于非变量量词不允许它与允许它一样令人困惑,因此他们选择了更容易支持的选项。
但是 {234}+{9,999999999}?
太糟糕了。令我震惊的是,它实际上是在 Java.