Java正则表达式匹配器未按预期分组

时间:2017-04-14 08:03:12

标签: java regex matcher

我有正则表达式

.*?(\\d+.*?\\d*).*?-.*?(\\d+.*?\\d*).*?

我希望匹配任何包含数字后跟“ - ”和另一个数字的字符串。任何字符串都可以介于其间。

此外,我希望能够使用Java Matcher类的组函数提取数字。

Pattern pattern = Pattern.compile(".*?(\\d+.*?\\d*).*?-.*?(\\d+.*?\\d*).*?");
Matcher matcher = pattern.matcher("13.9 mp - 14.9 mp");
matcher.matches();

我期待这个结果:

matcher.group(1) // this should be 13.9 but it is 13 instead
matcher.group(2) // this should be 14.9 but it is 14 instead

知道我缺少什么吗?

2 个答案:

答案 0 :(得分:2)

您当前的模式有几个问题。正如其他人所指出的那样,如果你想让它们成为文字点,那么你的圆点应该用两个反斜杠进行转义。我认为你想用来匹配一个可能有或没有小数部分的数字的模式是:

(\\d+(?:\\.\\d+)?)

符合以下条件:

\\d+          one or more numbers
(?:\\.\\d+)?  followed by a decimal point and one or more numbers
              this entire quantity being optional

完整代码:

Pattern pattern = Pattern.compile(".*?(\\d+(?:\\.\\d+)?).*?-.*?(\\d+(?:\\.\\d+)?).*?");
Matcher matcher = pattern.matcher("13.9 mp - 14.9 mp");
while (matcher.find()) {
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2));
}

<强>输出:

13.9
14.9

答案 1 :(得分:0)

.*?(\d+\.*\d*).*?-.*?(\d+\.*\d*).*?

。在你的正则表达式中'\ d +'和' \ d '之间应该更改为\。