2012-01-19 33 views
9

tôi có mã tiếp theo:không tham lam Regular Expression trong Java

public static void createTokens(){ 
    String test = "test is a word word word word big small"; 
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test); 
    while (mtch.find()){ 
     for (int i = 1; i <= mtch.groupCount(); i++){ 
      System.out.println(mtch.group(i)); 
     } 
    } 
} 

Và có đầu ra tiếp theo:

word 
w 

Nhưng theo ý kiến ​​của tôi nó phải là:

word 
word 

Somebody xin vui lòng giải thích cho tôi tại sao như vậy?

Trả lời

10

Vì các mẫu của bạn không tham lam nên chúng khớp với ít văn bản nhất có thể trong khi vẫn bao gồm một kết hợp.

Xóa? trong nhóm thứ hai, và bạn sẽ nhận được từ
từ
chữ lớn nhỏ

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test); 
+0

Và bây giờ nhóm thứ hai đang chụp quá nhiều thay vì quá ít. Không tham lam không phải là vấn đề, và tham lam không phải là giải pháp. –

+1

Bạn đúng, nhưng IMHO, sự không tham lam của nhóm chụp thứ hai giải thích lý do tại sao nó chỉ chụp "w". Nhóm chụp đầu tiên phải chụp "từ" vì chữ "từ" theo sau nó. Tôi không biết chính xác những gì anh ta đang tìm kiếm và anh ấy đã chỉnh sửa câu hỏi sau khi tôi gửi câu trả lời của tôi, vì vậy tôi không thể cung cấp một regexp chính xác. – theglauber

3

Bằng cách sử dụng \\s* nó sẽ phù hợp với bất kỳ số lượng không gian bao gồm 0 không gian. w khớp với (\\s*.+?\\s*). Để đảm bảo nó khớp với một từ được phân tách bằng dấu cách, hãy thử (\\s+.+?\\s+)

+0

Rắc rối là, regex đã tiêu thụ các ký tự khoảng trắng trước và sau từ, vì vậy bây giờ bạn đang cố gắng tiêu thụ chúng hai lần. –

+0

Tất cả những gì bạn cần làm là xóa không gian khỏi regex như ... '\\ s +) word (\\ s +' ... –

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