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

Java regex matcher doesn't group as expected

我有一个正则表达式

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

我想匹配包含数值后跟“-”和另一个数字的任何字符串。任何字符串都可以介于两者之间。

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

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

知道我错过了什么吗?

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

(\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
.*?(\d+\.*\d*).*?-.*?(\d+\.*\d*).*?

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