我想写一个正则表达式匹配一串数字正好12次(可能有一个额外的数字在字符串的开始,然后我想丢弃)。正则表达式的烦恼
我写这个正则表达式时,他们都喜欢123.0123匹配这些数字(\ d + \ d +)。
String str3 = "0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487";
Pattern dataLinePattern = Pattern.compile("^(\\d+\\.\\d+\\s)?((\\d+\\.\\d+\\s*?){12})$"); Matcher m = dataLinePattern.matcher(str3); if (m.matches()) { System.out.println(m.group(2)); }
预期成果是:
0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487
但是,当我尝试类似
"^(\d+[\.\d]?\t?)?((\d+[\.\d]?\t*?){12})$"
或
"^(\d+(\.\d+)?\t?)?((\d+(\.\d+)?\t*?){12})$"
使小数位可选,正则表达式切断第一号,并打印仅在过去的11 ...我在做什么错?
输出:
0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487
(失踪0.0503)
编辑:解决。 问题归结为可选的制表符分隔符\ t *?当该选项卡对于最后12个数字是可选的时,正则表达式引擎将返回并查找匹配并且发现最后一个数字将匹配两次:0和0487(在本示例中)
重新排列正则表达式以将每个数字开头的标签,而不是每个数字末尾的“可能”,这使得它可以工作。
Pattern.compile("([0-9.]+\t)?(([0-9.]+)(\t[0-9.]+){11})");
工作对我来说.. – 2014-09-24 17:44:08
它工作正常,检查http://regex101.com/r/ uO1lR6/1 – 2014-09-24 17:45:26
第一个代码块中的代码有效,你是否尝试使用下面的2个替代正则表达式? (由于某些原因,它们没有以正确的java格式粘贴,所以你不得不加入反斜杠) – 2014-09-24 18:02:58