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

2022-08-31 12:50:07

因此,以某种方式(玩弄),我发现自己有一个像.\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}

为什么会发生这种情况?它是否在某个地方的正则表达式/ Java文档中明确说明,或者它只是Java开发人员即时做出的决定,或者它可能是一个错误?

还是它实际上没有被忽视,它实际上意味着完全不同的东西?

不是说这很重要,但它不是全面的正则表达式行为,Rubular做了我所期望的。

注意 - 标题主要用于了解其工作原理(而不是原因)的用户的可搜索性。


答案 1

IEEE标准1003.1说:

多个相邻重复符号(“*”和间隔)的行为会产生未定义的结果。

因此,每个实现都可以随心所欲地做,只是不要依赖任何具体的东西......


答案 2

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

量词前面必须有一个可以重复的令牌«{2}»

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


我假设java正则表达式引擎只是忽略了错误/表达式,并与到目前为止编译的内容一起工作。

编辑

@piet.t的答案中对IEEE标准的引用似乎支持了这一假设。

编辑 2(@fncomp)

为了完整性,人们通常会使用以避免捕获组。然后,完整的正则表达式变为(?:)^(?:\d{1}){2}