参考这个问题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 ;.有人可以帮助我以一种很好的方式解决这个问题吗?
非常感谢每一个答案/评论。
答案 0 :(得分:3)
如下所示更改正则表达式
Pattern p = Pattern.compile("-?\\d+(?:\\.\\d+)?");
(?:\\.\\d+)?
在最后会使小数部分成为可选项。
答案 1 :(得分:3)
[-+]?\\d+(\\.\\d+)?
使用this表示浮点数和整数。
这是因为-?[\\d\\.]+
[]
character class
。它可以匹配类中定义的任何字符。
答案 2 :(得分:0)
像-?\d*(?:\.\d+)?
这样的正则表达式会导致引擎在任何地方找到零宽度匹配。更好的方法是简单地使用交替来要求 有一个数字或一个或多个数字的点,之后一个数字更多的点是可选的:
-?(?:\.\d+|\d+(?:\.\d+)?)
在Java中你需要像这样逃避:
Pattern p = Pattern.compile("-?(?:\\.\\d+|\\d+(?:\\.\\d+)?)");
或者,您可以添加前瞻,要求某处至少有一个数字:
-?(?=\.?\d)\d*(?:\.\d+)?