簡體   English   中英

使用Java中的RegEx從String中提取兩個double值

[英]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)));
    }
  1. .*? 不情願地吃人物
  2. (\\\\d+\\\\.?\\\\d*)一些數字,一個可選的小數點,一些更多的數字
  3. \\\\s+至少一個空格字符(例如制表符)
  4. (\\\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM