使用Java中的RegEx从String中提取两个double值

时间:2010-05-31 13:30:40

标签: java regex

我正在逐行读取文件,需要从中提取纬度和经度。 线条看起来如何:

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  

可以肯定的是,除了表示双打的数字之外,没有数字包围的点。 不幸的是,没有点的值,所以最好从字符串末尾检查数字。

感谢您的帮助!

6 个答案:

答案 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)));
    }
  1. .*?不情愿地吃人物
  2. (\\d+\\.?\\d*)一些数字,一个可选的小数点,一些更多的数字
  3. \\s+至少一个空白字符(例如制表符)
  4. (\\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)));
}

欢呼声