2010-02-10 21 views
8

Có cách nào để biểu hiện trong ngoặc đơn không phải là bị bắt trong một nhóm không?Đánh số nhóm với các khối tùy chọn trong Cụm từ thông dụng

Ví dụ: tôi có một cái gì đó biểu hiện như thế này:

(A(B|C)?) D (E(F|G)?) 

Hãy chú ý của các khối không bắt buộc (B|C)?(F|G)? ngoặc cần.
Tôi không quan tâm đến những gì đã bị bắt trong các nhóm này. Tất cả tôi muốn là để nắm bắt khối đầu tiên và cuối cùng.

Nhưng vì các khối không bắt buộc, việc đánh số nhóm sẽ thay đổi và tôi không thể nói nếu (E(F|G)?) đã bị bắt như nhóm 2 hoặc 3.

Tôi có thể nói với các biểu thức để bỏ qua những phần bắt buộc trong các nhóm kết quả , vì vậy việc đánh số nhóm sẽ giữ nguyên? Hoặc tôi có thể làm cho tùy chọn bắt luôn xuất hiện trong các nhóm - ngay cả khi họ đang null?

Trả lời

15

(E(F|G)?) sẽ luôn luôn bị bắt như nhóm 3. Việc đánh số được xác định bởi thứ tự mở ngoặc trong chuỗi mô hình, đó là:

(A(B|C)?) D (E(F|G)?) 
^^  ^^ 
1 2   3 4 

Nếu (B|C) không xảy ra trong chuỗi đầu vào sau đó group(2) sẽ trả về null, nhưng các nhóm tiếp theo sẽ không được đổi lại.

Các nhóm duy nhất không ảnh hưởng đến đánh số là các nhóm không thu thập, ví dụ:

(A(?:B|C)?) D (E(?:F|G)?) 
^   ^
1    2 

Ví dụ:

Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)"); 
Matcher matcher = pattern.matcher("A D EG"); 
if (matcher.matches()) { 
    System.err.println(matcher.group(1)); 
    System.err.println(matcher.group(2)); 
    System.err.println(matcher.group(3)); 
    System.err.println(matcher.group(4)); 
} 

Output:

A 
null 
EG 
G 
+0

Bạn nói đúng. Dường như tôi đã bị lừa bởi trình cắm thêm QuickLx nhật thực của tôi, chỉ hiển thị 3 nhóm (nhưng với chỉ mục 1, 3 và 4). Tuy nhiên, bit không bắt giữ vẫn rất tiện dụng để giảm nhiễu. – Stroboskop

9

Có nhóm phi chụp (?:…):

(A(?:B|C)?) D (E(?:F|G)?) 

Trận đấu của một nhóm như vậy không thể được tham chiếu.

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