2010-05-31 39 views
5

Tôi đang đọc một tệp theo hàng và cần trích xuất vĩ độ và kinh độ từ nó. này cách đường có thể nhìn:Trích xuất hai giá trị kép từ Chuỗi bằng cách sử dụng RegEx trong 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 

gì là chắc chắn là, không có chấm được bao quanh bởi chữ số trừ những người đại diện cho nội dung đôi nam. Thật không may là có các giá trị không có dấu chấm, vì vậy tốt nhất nên kiểm tra các số từ cuối chuỗi.

cảm ơn sự giúp đỡ của bạn!

Trả lời

3

Nếu bạn có thể sử dụng 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); 
+1

Đó là yêu thích của tôi khi nó thực hiện 'K.I.S.S. –

+0

Cảm ơn! Điều này hoàn toàn làm công việc đúng và khi bạn đề cập đến nó "K.I.S.S" es! – tzippy

3

Đây có phải là bảng csv được phân cách bằng tab không? Sau đó, tôi muốn đề nghị xem xét String # split và chỉ cần chọn hai trường cuối cùng từ mảng String kết quả.

... anyway, ngay cả khi không phải csv, phân tách trên whitechars và lấy hai trường cuối cùng của mảng String - đó là những giá trị lat/lon và bạn có thể chuyển đổi chúng với Double # parseDouble.

+0

Các phân đoạn được tab tách, nhưng đôi khi có nhiều hơn một tab phân tách hai phân đoạn. – tzippy

+0

Điều đó không quan trọng. –

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. .*? ăn nhân vật bất đắc dĩ
  2. (\\d+\\.?\\d*) một số chữ số, một dấu thập phân tùy chọn, một số chữ số hơn
  3. \\s+ ít nhất một White- ký tự khoảng trắng (chẳng hạn như ký tự tab)
  4. (\\d+\\.?\\d*) một số chữ số, một dấu thập phân tùy chọn, một số chữ số hơn
0

giải pháp này sử dụng Scanner.findWithinHorizon và nhóm chụp:

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)) 
     ); 
    } 

này in:

[DE|83543] Blah blah blah     [47.9830:12.1278] 
[DE|21147] 100% hamburger beef for 4.99 [53.5500:10.0000] 

Lưu ý cách tiếp cận meta-regex sử dụng replace để tạo regex "cuối cùng". Điều này được thực hiện cho khả năng đọc của mẫu "hình ảnh lớn".

0

Tôi đã thử này:

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); 
    } 

Nó chia tách chuỗi bất cứ khi nào nó gặp khoảng trắng. Vì các tọa độ sẽ luôn là hai phần tử cuối cùng nên nó có thể in chúng mà không có bất kỳ vấn đề gì. Dưới đây là đầu ra.

53,55, 10,0

47,983, 12,1278

0

Tôi nghĩ rằng đây là mô hình đúng để nhận được vĩ độ và kinh độ ra khỏi chuỗi đó phải phù hợp với ví dụ (45.23423,15.23.423) (có hoặc không có khoảng trắng sau dấu phẩy [,])

trả lời dựa trên câu trả lời của aioobe trên:

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))); 
} 

cổ vũ

Các vấn đề liên quan