Regexp烦恼

时间:2014-09-24 17:35:25

标签: java regex

我正在尝试编写一个正好匹配一串数字的正则表达式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)); }
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})$"

使小数位可选,正则表达式切断第一个数字并打印最后11个......我做错了什么?

输出:

"^(\d+(\.\d+)?\t?)?((\d+(\.\d+)?\t*?){12})$" (缺少0.0503)

编辑:已解决。  问题归结为可选的制表符分隔符\ t *?当该标签对于最后12个数字是可选的时,正则表达式引擎将返回并查找匹配并发现最后一个数字将匹配两次:0和0487(在此示例中)

重新排列正则表达式以将标签放在每个数字的开头而不是每个数字末尾的“可能”使其工作。

0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487

1 个答案:

答案 0 :(得分:1)

试试这个:

String str3 = "0.0 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(".*\\s+((\\d+(\\.\\d+)?)(\\s+(\\d+(\\.\\d+)?)){11})\\s*$");
Matcher m = dataLinePattern.matcher(str3);

if (m.matches()) {
    System.out.println(m.group().trim().replaceAll("\\s+", " "));
}

打印:

0.0503 0.0485 0.0481 0.0491 0.0494 0.0489 0.0482 0.0485 0.0479 0.0487 0.0495 0.0487