2017-06-03 19 views
8

Tôi đã ở dưới mã và trong đó tôi đang cố gắng in tất cả các kết quả phù hợp trong một Chuỗi bằng cách sử dụng Matcher.group().Tại sao Matcher.group ném IndexOutOfBoundsException Exception

public static void main(String[] args) { 
     String s = "foo\r\nbar\r\nfoo" 
       + "foo, bar\r\nak = " 
       + "foo, bar\r\nak = " 
       + "bar, bar\r\nak = " 
       + "blr05\r\nsdfsdkfhsklfh"; 
     //System.out.println(s); 
     Matcher matcher = Pattern.compile("^ak\\s*=\\s*(\\w+)", Pattern.MULTILINE) 
       .matcher(s); 
     matcher.find(); 
     // This one works 
     System.out.println("first match " + matcher.group(1)); 
     // Below 2 lines throws IndexOutOfBoundsException 
     System.out.println("second match " + matcher.group(2)); 
     System.out.println("third match " + matcher.group(3)); 

    } 

Trên đang ném ngoại lệ trong chủ đề java.lang.IndexOutOfBoundsException "chính": Không có nhóm 2 ngoại lệ.

Vì vậy, Câu hỏi của tôi là cách Matcher.group() hoạt động và Như bạn có thể thấy tôi sẽ có 3 chuỗi phù hợp, làm cách nào tôi có thể in tất cả chúng bằng cách sử dụng group().

+0

Bạn có thể muốn đặt điểm ngắt kiểm tra những gì 'matcher' nắm giữ, cách' nhóm' và 'tìm' tương tác, v.v. – luk2302

+0

@ luk2302, tôi đã sử dụng trình gỡ lỗi nhưng không biết cách' nhóm' và 'tìm 'tương tác, –

Trả lời

7

Rõ ràng là bạn chỉ có một nhóm:

^ak\\s*=\\s*(\\w+) 
//   ^----^----------this is the only group 

thay vào đó bạn phải sử dụng một vòng lặp ví dụ:

while(matcher.find()){ 
    System.out.println("match " + matcher.group()); 
} 

Đầu ra

match = foo 
match = bar 
match = blr05 

đọc về groups:

Chụp nhóm

ngoặc nhóm regex giữa chúng. Họ nắm bắt các văn bản phù hợp bởi các regex bên trong chúng thành một số nhóm có thể được tái sử dụng với một backreference đánh số. Chúng cho phép bạn áp dụng toán tử regex cho toàn bộ regex được nhóm.

+0

tại sao chỉ có 1 nhóm? làm thế nào nó tạo ra và tôi không thể tạo nhiều nhóm để không lặp lại tôi có thể in tất cả. –

+0

nhóm được xác định giữa các dấu ngoặc đơn, do đó, trong mẫu của bạn, bạn chỉ có '(\\ w +)' để có nghĩa là bạn chỉ có một nhóm @AmitK nhận được nó? –

+1

đã nhận được, nhờ –

2

Bạn dường như bị nhầm lẫn bởi nhóm chụp và số lượng kết quả phù hợp được tìm thấy trong chuỗi của bạn với mẫu nhất định. Trong mô hình mà bạn sử dụng, bạn chỉ có một nhóm chụp:

^ak\\s*=\\s*(\\w+) 

Một nhóm chụp được đánh dấu bằng dấu ngoặc đơn trong mẫu.

Nếu bạn muốn lấy mỗi trận đấu của mô hình của bạn chống lại các chuỗi đầu vào, sau đó bạn nên sử dụng một vòng lặp while:

while (matcher.find()) { 
    System.out.println("entire pattern: " + matcher.group(0)); 
    System.out.println("first capture group: " + matcher.group(1)); 
} 

Mỗi cuộc gọi đến Matcher#find() sẽ áp dụng mô hình so với chuỗi đầu vào, từ bắt đầu để kết thúc, và sẽ làm cho có sẵn bất cứ điều gì phù hợp.

+0

Cảm ơn bạn rất nhiều lời giải thích tốt đẹp +1. –

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