Извлечь два двойных значения из строки, используя RegEx в Java - PullRequest
5 голосов
/ 31 мая 2010

Я читаю файл построчно, и мне нужно извлечь из него широту и долготу. Вот как могут выглядеть строки:

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 ]

3 голосов
/ 31 мая 2010

Если вы можете использовать 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);
3 голосов
/ 31 мая 2010

Это таблица CSV, разделенная табуляцией? Тогда я бы посоветовал посмотреть на String # split и просто выбрать два последних поля из полученного массива String.

... в любом случае, даже если не csv, разделите на whitechars и возьмите два последних поля массива String - это значения широты и долготы, и вы можете преобразовать их с помощью Double # parseDouble.

0 голосов
/ 26 августа 2012

Я думаю, что это правильный шаблон для получения широты и долготы из строки, который должен соответствовать, например (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)));
}

ура

0 голосов
/ 31 мая 2010

Я пробовал это:

    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

0 голосов
/ 31 мая 2010

В этом решении используются 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 для генерации "окончательного" регулярного выражения Это сделано для удобочитаемости шаблона «большой картинки».

0 голосов
/ 31 мая 2010
    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*) несколько цифр, необязательный десятичный знак, еще несколько цифр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...