[英]Extract two double Values from String using RegEx in Java
我正在逐行閱讀文件,需要從中提取緯度和經度。 線條看起來如何:
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
可以肯定的是,除了表示雙打的數字之外,沒有數字包圍的點。 不幸的是,沒有點的值,所以最好從字符串末尾檢查數字。
謝謝你的幫助!
如果你可以使用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);
它是一個分隔csv表的制表工具嗎? 然后我建議查看String#split並簡單地從結果String數組中選擇最后兩個字段。
...無論如何,即使不是csv,在whitechars上拆分並獲取String數組的最后兩個字段 - 這些是lat / lon值,你可以用Double#parseDouble轉換它們。
我認為這是正確的模式,用於獲取必須匹配的字符串的緯度和經度,例如(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)));
}
干杯
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*)
一些數字,一個可選的小數點,一些更多的數字 此解決方案使用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
生成“最終”正則表達式的meta-regex方法。 這是為了“大圖”模式的可讀性。
我試過這個:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.