从 Java 中的字符串中提取数字

Extract numbers from String in Java

参考这个问题here。我有一个新问题。我想从字符串中提取最后两个出现的数字 (longitude/latitude)。

我使用参考答案中的方法。可以在此处找到发生错误的简单示例:

public static void main(String[] args) {
    String input = "St. Louis (38.6389, -90.342)"; 

    Pattern p = Pattern.compile("-?[\d\.]+");
    Matcher m = p.matcher(input);

    while(m.find()){
        System.out.println(m.group());
    }
}

控制台输出如下:

.
38.6389
-90.342

问题似乎是“.”在 "St. Louis"。有人可以帮我以一种很好的方式解决这个问题吗?

非常感谢每一个answer/comment。

像下面这样更改您的正则表达式,

Pattern p = Pattern.compile("-?\d+(?:\.\d+)?");

(?:\.\d+)? 最后将使小数部分成为可选的。

[-+]?\d+(\.\d+)?

对浮点数和整数使用 this

问题似乎是“.”在“圣路易斯”

那是因为 -?[\d\.]+ [] character class。它可以匹配 class 中定义的任何字符。

-?\d*(?:\.\d+)? 这样的正则表达式会导致引擎到处寻找零宽度匹配项。更好的方法是简单地使用交替来要求 或者 有一个带数字的点 一个或多个数字,然后是一个带更多数字的点可选:

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

Debuggex Demo

在 Java 中你需要像这样转义:

Pattern p = Pattern.compile("-?(?:\.\d+|\d+(?:\.\d+)?)");

或者,您可以添加一个前瞻,要求某处至少有一个数字:

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

Debuggex Demo