一尘不染

{m} {n}(“恰好n次”两次)如何工作?

java

因此,以某种方式(玩转),我发现自己使用了regex这样的正则表达式\d{1}{2}

从逻辑上讲,对我来说,它应表示:

(一个数字正好一次)正好两次,即一个数字正好两次。

但实际上,它似乎仅表示“一个数字仅一次”(因此忽略了{2})。

String regex = "^\\d{1}{2}$"; // ^$ to make those not familiar with 'matches' happy
System.out.println("1".matches(regex)); // true
System.out.println("12".matches(regex)); // false

使用{n}{m,n}或相似,可以看到相似的结果。

为什么会这样?它是在regex / Java文档中的某个地方明确声明的,还是只是Java开发人员即时做出的决定,还是一个错误?

还是实际上不被忽略而实际上意味着完全其他的东西?

并不是很重要,但是它并不是全面的正则表达式行为,Rubular可以满足我的期望。

注意-标题主要是为希望了解其工作原理(而非原因)的用户提供可搜索性。


阅读 198

收藏
2020-12-03

共1个答案

一尘不染

当我使用Java regex语法在RegexBuddy中输入您的正则表达式时,它显示以下消息

量词之前必须带有可重复«{2}»的标记

将正则表达式更改为显式使用分组^(\d{1}){2}可以解决该错误并按预期工作。


我假设java regex引擎只是忽略了错误/表达式,并且可以使用到目前为止已编译的东西。

编辑

在参考IEEE-标准在@
piet.t的答案似乎支持这一假设。

编辑2 (对@fncomp表示感谢)

为了完整起见,通常(?:)会避免捕获该组。完整的正则表达式变为^(?:\d{1}){2}

2020-12-03