2013-04-16 41 views
5

Tôi đang nghiên cứu về OCP java và tại thời điểm này tôi bị kẹt khi hiểu phần "Capturing groups". Đó là một cách quá trừu tượng như một mô tả. Bạn có thể vui lòng (nếu bạn có thời gian) cho tôi một số ví dụ thực sự bằng cách sử dụng "Chụp nhóm"?Cố gắng hiểu "Chụp nhóm" trong regex bằng Java

Có ai có thể cung cấp cho tôi một ví dụ cụ thể về tuyên bố sau không?

Chụp nhóm là cách để xử lý nhiều ký tự dưới dạng đơn vị . Chúng được tạo ra bằng cách đặt các ký tự được nhóm lại bên trong một tập hợp các dấu ngoặc đơn. Ví dụ: biểu thức chính quy (dog) tạo một nhóm chứa các chữ "d" "o" và "g". Phần của chuỗi đầu vào khớp với nhóm chụp sẽ là được lưu trong bộ nhớ để thu hồi sau thông qua backreferences (như được thảo luận bên dưới trong phần, Backreferences).

Tôi chắc chắn tôi sẽ nhận được ngay sau khi tôi xem ví dụ cụ thể.

Xin cảm ơn trước.

Trả lời

13

Trong số những thứ khác, regex cho phép bạn có được các phần của đầu vào được so khớp bởi các phần khác nhau của cụm từ thông dụng. Đôi khi bạn cần toàn bộ trận đấu, nhưng thường bạn chỉ cần một phần của nó. Ví dụ, biểu thức chính quy này phù hợp "Page X of Y" chuỗi:

Page \d+ of \d+ 

Nếu bạn vượt qua nó một chuỗi

Page 14 of 203 

bạn sẽ phù hợp với toàn bộ chuỗi. Bây giờ, giả sử bạn chỉ muốn 14203. Không vấn đề gì - thư viện regex cho phép bạn đính kèm hai số \d+ vào dấu ngoặc đơn và sau đó chỉ truy xuất các chuỗi "14""203" từ kết quả phù hợp.

Page (\d+) of (\d+) 

Biểu thức trên tạo hai nhóm chụp nhóm. Các đối tượng Matcher thu được bằng cách kết hợp các mô hình cho phép bạn lấy nội dung của những nhóm riêng lẻ:

Pattern p = Pattern.compile("Page (\\d+) of (\\d+)"); 
String text = "Page 14 of 203"; 
Matcher m = p.matcher(text); 
if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

này in 14203.

Demo on ideone.

+1

+1 để sử dụng http://stackoverflow.com/questions/16034337/generating-a-regular-expression-from-a-string làm ví dụ! –

1

Đó là vì nó bạn muốn theo dõi các phần của trận đấu. Ví dụ, nếu bạn có regex

/^(http|ftp).*/

và bạn sẽ có một trận đấu, bạn có thể truy vấn phù hợp cho nhóm, và cho biết nếu nó là http hoặc ftp.

0

Ví dụ lấy regex

cat (dog)?bus 

này sẽ phù hợp cả chuỗi cat dog buscat bus.Đó là vì toàn bộ phần dog là tùy chọn vì số ?. Nếu bạn không quấn nó trong paren, thì chỉ có không gian cuối cùng sẽ là tùy chọn.

James while John (had)+a better effect on the teacher 

sẽ phù hợp với chuỗi

James while John had had had had had had had had had had had a better effect on the teacher 

vì nó sẽ phù hợp với một hoặc nhiều của toàn bộ had chuỗi.

Bạn cũng có thể sử dụng tham chiếu luân phiên và quay lại với các nhóm chụp (thứ mà bạn chưa nhận được).

(cat|dog) is a \1 

\1 là tham chiếu đến mọi thứ được chụp trong nhóm chụp đầu tiên. Điều này sẽ khớp với dog is a dogcat is a cat, nhưng không khớp với dog is a cat hoặc ngược lại.

0

Here bạn thấy một số ví dụ mã bạn có thể dễ dàng hiểu.

Về cơ bản những gì bạn có trong vòng () bạn đã nhớ sau trận đấu. Và bạn có thể thấy chuỗi khớp với nhóm đó. Hãy nhớ rằng nếu bạn thực hiện một kết hợp thứ hai, các giá trị này được thay thế bằng kết hợp thứ hai, do đó nếu bạn cần chúng, bạn cần lưu chúng ngay lập tức sau khi khớp với một số biến được xác định bởi bạn.

2

Các nhóm chụp cho phép để truy vấn Matcher để tìm hiểu những gì một phần của chuỗi là phù hợp đối với một bộ phận cụ thể của biểu thức chính quy, xem ví dụ sau:

String dateStr = "1981-06-25"; 

Pattern datePatt = Pattern.compile("([0-9]{4})/([0-9]{2})/([0-9]{2})"); 
... 
Matcher m = datePatt.matcher(dateStr); 
if (m.matches()) { 
    int year = Integer.parseInt(m.group(1)); 
    int month = Integer.parseInt(m.group(2)); 
    int day = Integer.parseInt(m.group(3)); 
} 

Các biến năm, tháng và ngày chứa giá trị của các nhóm 1, 2 và 3 tương ứng.

+2

Ví dụ tốt, ngoại trừ bạn đang trộn lẫn ngày và tháng ở đâu đó (cũng có thể nói rằng thực tế không tốt là để ngày và tháng đi từ 0 đến 99). – ddmps

+0

Cảm ơn bạn Pescis, sự pha trộn được cố định ngay bây giờ. Đây không phải là phương pháp hay nhất để làm việc với ngày tháng, nhưng là một ví dụ đơn giản để hiểu các nhóm chụp. –

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