2011-02-06 31 views
5

tôi muốn tìm xem một mẫu cụ thể có tồn tại trong tệp văn bản của tôi hay không.Làm thế nào phù hợp với một mẫu trong văn bản bằng cách sử dụng máy quét và lớp mẫu?

im sử dụng các lớp học sau đây cho việc này:

java.util.regex.Pattern and java.util.Scanner; 

Dòng văn bản mẫu của tôi là

String Line="DBREF 1A1F A 102 190 UNP P08046 EGR1_MOUSE  308 396"; 

và, tôi muốn để phù hợp với loại sau đây của các mẫu:

A 102 190 

ở đâu, tại vị trí của az hoặc AZ nhưng điều lệ duy nhất.

ở vị trí 102 của bất kỳ số nguyên và chiều dài bất kỳ.

ở vị trí 190 của bất kỳ số nguyên và chiều dài bất kỳ.

và Mã của tôi cho phù hợp với mô hình là:

 Scanner sr=new Scanner(Line); 
    Pattern p = Pattern.compile("\\s+([a-zA-Z]){1}\\s+\\d{1,}\\s+\\d{1,}\\s+"); 
    while(sr.hasNext(p)) 
    { 
     System.out.println("Pattern exists"); 
     System.out.println("Matched String : "+sr.next(p)); 
    } 

nhưng, mẫu không phù hợp ngay cả khi nó tồn tại ở đó ..

tôi nghĩ rằng vấn đề là với chuỗi mô hình của tôi:

\\s+([a-zA-Z]){1}\\s+\\d{1,}\\s+\\d{1,}\\s+" 

ai, Plz giúp tôi những gì chuỗi mẫu nên tôi sử dụng ????

Trả lời

10

Tôi không chắc rằng Máy quét là công cụ tốt nhất cho việc này vì hasNext (Mẫu) kiểm tra xem mã vạch hoàn chỉnh tiếp theo có mẫu tiếp theo hay không. Mẫu của bạn đi qua các thẻ.

bạn đã thử sử dụng một đối tượng Matcher thay vì Scanner?

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Foo2 { 
    public static void main(String[] args) { 
     String line = "DBREF 1A1F A 102 190 UNP  P08046 EGR1_MOUSE  308  396"; 
     Pattern p = Pattern.compile("\\s+[a-zA-Z]\\s+\\d{1,}\\s+\\d{1,}\\s+"); 

     Matcher matcher = p.matcher(line); 

     while (matcher.find()) { 
      System.out.printf("group: %s%n", matcher.group()); 
     } 
     System.out.println("done"); 
    } 
} 
+0

vẫn không làm việc .. tôi nghĩ rằng vấn đề là với các đối số Pattern.compile –

+0

Họ làm việc tốt cho tôi. Một chút tiết có lẽ, nhưng họ nên làm việc. Hãy thử một chương trình thử nghiệm được biên dịch nhỏ như được hiển thị ở trên. –

+0

có u thử với dòng này: - DBREF 1A1F Một 102 190 UNP P08046 EGR1_MOUSE 308 396 –

3

dòng regex này hoạt động:

\\s+\\w\\s+\\d+\\s+\\d+ 

group(0) của matcher (p.matcher) bạn mang đến cho A 102 190

.

[EDIT] Ok, tôi sẽ cung cấp cho bạn một mẫu làm việc hoàn chỉnh sau đó:

Pattern p = Pattern.compile("\\s+\\w\\s+\\d+\\s+\\d+"); 
    Matcher matcher = p.matcher("DBREF 1A1F A 102 190 UNP P08046 EGR1_MOUSE  308 396"); 
    matcher.find(); 
    System.out.println("Found match: " + matcher.group(0)); 
    // Found match: A 102 190 
+0

vẫn không hoạt động .. –

+0

Tôi vừa thử nó, nó hoạt động. Bạn có chắc là bạn đang trích xuất 'nhóm' đầu tiên của đối sánh của mình không? –

+0

bạn đã thử với Dòng này: - DBREF 1A1F A 102 190 UNP P08046 EGR1_MOUSE 308 396 –

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