Regex Group
Nhóm bắt sử dụng () và tham chiếu ngược. Nhóm một phần mẫu để bắt và tái sử dụng chuỗi con đã khớp.
Nhóm regex sử dụng dấu ngoặc đơn () để nhóm một phần mẫu lại với nhau. Chúng phục vụ hai mục đích: nhóm các phần tử để áp dụng bộ lượng hóa hoặc luân phiên, và bắt văn bản đã khớp để tái sử dụng sau. Ví dụ, (\d{4})-(\d{2})-(\d{2}) khớp ngày như "2024-03-15" và bắt năm, tháng, ngày thành các nhóm riêng biệt.
Có ba loại nhóm chính. Nhóm bắt (pattern) bắt văn bản đã khớp và gán số nhóm (1, 2, 3...). Nhóm có tên (?<name>pattern) gán tên thay vì số, cải thiện khả năng đọc. Nhóm không bắt (?:pattern) nhóm mà không bắt, hữu ích khi chỉ cần nhóm cho luân phiên hoặc bộ lượng hóa. Bạn có thể tham khảo sách regex nâng cao về kỹ thuật nhóm.
Trong thực tế, nhóm regex được sử dụng rộng rãi cho trích xuất dữ liệu. Phân tích URL: (https?)://([\/\w.-]+)(/.*)? trích xuất giao thức, tên miền và đường dẫn. Phân tích log: (\d{4}-\d{2}-\d{2}) (\w+): (.+) trích xuất ngày, mức log và thông điệp. Xác thực email: nhóm tách phần local và phần domain để xác thực riêng.
Nhóm lồng nhau được đánh số theo vị trí dấu ngoặc mở. Trong ((\d{2})-(\d{2})), nhóm 1 là toàn bộ khớp, nhóm 2 là phần đầu tiên, nhóm 3 là phần thứ hai. Điều này có thể gây nhầm lẫn với các mẫu phức tạp, đó là lý do nhóm có tên được ưu tiên cho khả năng đọc. JavaScript truy cập nhóm có tên qua match.groups.name.
Một quan niệm sai lầm phổ biến là luôn nên sử dụng nhóm bắt. Trên thực tế, nhóm bắt không cần thiết tiêu tốn bộ nhớ và có thể ảnh hưởng đến hiệu suất. Sử dụng nhóm không bắt (?:...) khi không cần tham chiếu văn bản đã khớp. Ngoài ra, quá nhiều nhóm bắt khiến mẫu khó bảo trì - cân nhắc chia mẫu phức tạp thành nhiều bước đơn giản hơn. Bạn có thể tham khảo sách xử lý văn bản để tìm hiểu thêm.
Từ góc độ đếm ký tự, nhóm regex cho phép trích xuất và đếm các phần cụ thể của văn bản. Ví dụ, trích xuất tất cả URL từ tài liệu và đếm tổng ký tự của chúng, hoặc trích xuất nội dung được trích dẫn và đo độ dài. Điều này cho phép phân tích ký tự chi tiết ngoài đếm toàn văn bản.