因此,以某种方式(玩转),我发现自己使用了regex这样的正则表达式\d{1}{2}。
\d{1}{2}
从逻辑上讲,对我来说,它应表示:
(一个数字正好一次)正好两次,即一个数字正好两次。
但实际上,它似乎仅表示“一个数字仅一次”(因此忽略了{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}或相似,可以看到相似的结果。
{n}{m,n}
为什么会这样?它是在regex / Java文档中的某个地方明确声明的,还是只是Java开发人员即时做出的决定,还是一个错误?
还是实际上不被忽略而实际上意味着完全其他的东西?
并不是很重要,但是它并不是全面的正则表达式行为,Rubular可以满足我的期望。
注意-标题主要是为希望了解其工作原理(而非原因)的用户提供可搜索性。
当我使用Java regex语法在RegexBuddy中输入您的正则表达式时,它显示以下消息
量词之前必须带有可重复«{2}»的标记
将正则表达式更改为显式使用分组^(\d{1}){2}可以解决该错误并按预期工作。
^(\d{1}){2}
我假设java regex引擎只是忽略了错误/表达式,并且可以使用到目前为止已编译的东西。
编辑
在参考IEEE-标准在@ piet.t的答案似乎支持这一假设。
编辑2 (对@fncomp表示感谢)
为了完整起见,通常(?:)会避免捕获该组。完整的正则表达式变为^(?:\d{1}){2}
(?:)
^(?:\d{1}){2}