从Java中的String中提取数字

时间:2015-03-02 09:41:28

标签: java regex numbers

参考这个问题here。我有一个新问题。我想从String中提取最后两个出现的数字(经度/纬度)。

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

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

问题似乎是"。"在"圣。路易斯&#34 ;.有人可以帮助我以一种很好的方式解决这个问题吗?

非常感谢每一个答案/评论。

3 个答案:

答案 0 :(得分:3)

如下所示更改正则表达式

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

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

答案 1 :(得分:3)

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

使用this表示浮点数和整数。

问题似乎是"。"在"圣。路易斯"

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

答案 2 :(得分:0)

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

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

Regular expression visualization

Debuggex Demo

在Java中你需要像这样逃避:

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

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

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

Regular expression visualization

Debuggex Demo