从 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+)?)
在 Java 中你需要像这样转义:
Pattern p = Pattern.compile("-?(?:\.\d+|\d+(?:\.\d+)?)");
或者,您可以添加一个前瞻,要求某处至少有一个数字:
-?(?=\.?\d)\d*(?:\.\d+)?
参考这个问题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+)?)
在 Java 中你需要像这样转义:
Pattern p = Pattern.compile("-?(?:\.\d+|\d+(?:\.\d+)?)");
或者,您可以添加一个前瞻,要求某处至少有一个数字:
-?(?=\.?\d)\d*(?:\.\d+)?