Chụp và phân nhóm
Chụp nhóm (pattern)
tạo ra một nhóm đã chụp tài sản.
Một nhóm có liên quan mà bạn có thể thường thấy (và sử dụng) là (?:pattern)
, nhóm này tạo một nhóm mà không chiếm thuộc tính, do đó được đặt tên là nhóm không chiếm .
Một nhóm thường được sử dụng khi bạn cần lặp lại một chuỗi các mẫu, ví dụ (\.\w+)+
, hoặc để chỉ định nơi mà sự thay thế sẽ có hiệu lực, ví dụ: ^(0*1|1*0)$
( ^
, sau đó 0*1
hoặc 1*0
, sau đó $
) so với ^0*1|1*0$
( ^0*1
hoặc 1*0$
).
Một nhóm chụp, ngoài việc phân nhóm, cũng sẽ ghi lại văn bản khớp với mẫu bên trong nhóm chụp (pattern)
. Sử dụng ví dụ của bạn (.*):
, .*
đối sánh ABC
và :
đối sánh :
, và vì .*
nằm trong nhóm chụp (.*)
nên văn bản ABC
được ghi lại cho nhóm chụp 1.
Số nhóm
Toàn bộ mẫu được xác định là nhóm số 0.
Bất kỳ nhóm thu thập nào trong mẫu bắt đầu lập chỉ mục từ 1. Các chỉ số được xác định theo thứ tự của dấu ngoặc đơn mở của các nhóm thu thập . Ví dụ, đây là tất cả 5 nhóm chụp trong mẫu bên dưới:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Số nhóm được sử dụng trong tham chiếu ngược \n
trong mẫu và $n
trong chuỗi thay thế.
Trong các hương vị regex khác (PCRE, Perl), chúng cũng có thể được sử dụng trong các cuộc gọi phụ .
Bạn có thể truy cập văn bản được so khớp theo nhóm nhất định với Matcher.group(int group)
. Số nhóm có thể được xác định bằng quy tắc đã nêu ở trên.
Trong một số phiên bản regex (PCRE, Perl), có một tính năng đặt lại nhánh cho phép bạn sử dụng cùng một số để chụp các nhóm trong các nhánh luân phiên khác nhau .
Tên nhóm
Từ Java 7, bạn có thể xác định một nhóm thu thập được đặt tên (?<name>pattern)
và bạn có thể truy cập nội dung phù hợp vớiMatcher.group(String name)
. Regex dài hơn, nhưng mã có ý nghĩa hơn, vì nó cho biết những gì bạn đang cố gắng khớp hoặc trích xuất với regex.
Tên nhóm được sử dụng trong tham chiếu ngược \k<name>
trong mẫu và${name}
trong chuỗi thay thế.
Các nhóm bắt được đặt tên vẫn được đánh số với cùng một sơ đồ đánh số, vì vậy chúng cũng có thể được truy cập thông qua Matcher.group(int group)
.
Bên trong, việc triển khai của Java chỉ ánh xạ từ tên đến số nhóm. Do đó, bạn không thể sử dụng cùng một tên cho 2 nhóm chụp khác nhau.