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

3
我有一个正则表达式
.*?(\\d+.*?\\d*).*?-.*?(\\d+.*?\\d*).*?

我想匹配任何包含数字值后跟"-"和另一个数字的字符串。中间可以有任意字符串。
此外,我希望能够使用Java Matcher类的group函数提取这些数字。
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

有没有任何想法我错过了什么?


1
转义\d+.*\d*中的点,或者更好地使用\d+(?:\.\d+)? - Wiktor Stribiżew
2个回答

3

您当前的模式存在几个问题。正如其他人所指出的,如果您想要字面上的点,则应该使用两个反斜杠来转义它们。我认为,您想要使用的匹配可能具有小数部分的数字的模式是:

(\\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

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

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


这将匹配以数字结尾的句子。可以在这里查看。 - Tim Biegeleisen
正则表达式是Jones的,我只是修改了它以匹配他想要的值。也许这就是他想要的。 - Mr.lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接