我正在逐行读取文件,需要从中提取纬度和经度。 线条看起来如何:
DE 83543 Rott am Inn Bayern BY Oberbayern Landkreis Rosenheim 47.983 12.1278
DE 21147 Hamburg Hamburg HH Kreisfreie Stadt Hamburg 53.55 10
可以肯定的是,除了表示双打的数字之外,没有数字包围的点。 不幸的是,没有点的值,所以最好从字符串末尾检查数字。
感谢您的帮助!
答案 0 :(得分:3)
它是一个分隔csv表的制表工具吗?然后我建议查看String#split并简单地从结果String数组中选择最后两个字段。
...无论如何,即使不是csv,在whitechars上拆分并获取String数组的最后两个字段 - 这些是lat / lon值,你可以用Double#parseDouble转换它们。
答案 1 :(得分:3)
如果您可以使用java.lang.String#split()
//Split by tab
String values[] = myTextLineByLine.split("\t");
List<String> list = Arrays.asList(values);
//Reverse the list so that longitude and latitude are the first two elements
Collections.reverse(list);
String longitude = list.get(0);
String latitude = list.get(1);
答案 2 :(得分:0)
Pattern p = Pattern.compile(".*?(\\d+\\.?\\d*)\\s+(\\d+\\.?\\d*)");
Matcher m = p.matcher(s1);
if (m.matches()) {
System.out.println("Long: " + Double.parseDouble(m.group(1)));
System.out.println("Latt: " + Double.parseDouble(m.group(2)));
}
.*?
不情愿地吃人物(\\d+\\.?\\d*)
一些数字,一个可选的小数点,一些更多的数字\\s+
至少一个空白字符(例如制表符)(\\d+\\.?\\d*)
一些数字,一个可选的小数点,一些更多的数字答案 3 :(得分:0)
此解决方案使用Scanner.findWithinHorizon
和捕获组:
import java.util.*;
import java.util.regex.*;
//...
String text =
"DE 83543 Blah blah blah 47.983 12.1278\n" +
"DE\t21147 100% hamburger beef for 4.99 53.55 10\n";
Scanner sc = new Scanner(text);
Pattern p = Pattern.compile(
"(\\w+) (\\d+) (.*) (decimal) (decimal)"
.replace("decimal", "\\d+(?:\\.\\d+)?")
.replace(" ", "\\s+")
);
while (sc.findWithinHorizon(p, 0) != null) {
MatchResult mr = sc.match();
System.out.printf("[%s|%s] %-30s [%.4f:%.4f]%n",
mr.group(1),
mr.group(2),
mr.group(3),
Double.parseDouble(mr.group(4)),
Double.parseDouble(mr.group(5))
);
}
打印:
[DE|83543] Blah blah blah [47.9830:12.1278]
[DE|21147] 100% hamburger beef for 4.99 [53.5500:10.0000]
请注意使用replace
生成“最终”正则表达式的元正则表达式方法。这是为了“大图”模式的可读性。
答案 4 :(得分:0)
我试过这个:
public static void main(String[] args)
{
String str ="DE 83543 Rott am Inn Bayern BY Oberbayern Landkreis Rosenheim 47.983 12.1278";
String str1 ="DE 21147 Hamburg Hamburg HH Kreisfreie Stadt Hamburg 53.55 10 ";
String[] tempStr1 = str1.split("[ \t]+");
System.out.println(tempStr1.length);
double latitude = Double.parseDouble(tempStr1[tempStr1.length - 2]);
double longitude = Double.parseDouble(tempStr1[tempStr1.length - 1]);
System.out.println(latitude + ", " + longitude);
}
它会在遇到空格时分割字符串。由于坐标始终是最后两个元素,因此它应该能够毫无问题地打印它们。以下是输出。
53.55,10.0
47.983,12.1278
答案 5 :(得分:0)
我认为这是正确的模式,用于获取必须匹配的字符串的纬度和经度,例如(45.23423,15.23423)(在逗号[,]之后有或没有空格)
根据aioobe上面的答案回答:
Pattern p = Pattern.compile("^(\\d+\\.?\\d*),\\s?(\\d+\\.?\\d*)$");
Matcher m = p.matcher(s1);
if (m.matches()) {
System.out.println("Long: " + Double.parseDouble(m.group(1)));
System.out.println("Latt: " + Double.parseDouble(m.group(2)));
}
欢呼声