Bài học theo mô-đun (3/4)
Nhóm không bắt giữ: `(?:...)`
Thông thường chỉ cần dấu ngoặc đơn để nhóm (định lượng, thay thế)
và KHÔNG trích xuất giá trị. Trong trường hợp đó, hãy sử dụng không chụp
phiên bản: (?:...). Nó hoạt động giống hệt (...) nhưng không tạo
một nhóm được đánh số.
Pattern: (?:https?)://(\w+\.\w+)
Sample: https://example.com e http://test.org
Match e gruppi:
match = "https://example.com" gruppo1 = "example.com"
match = "http://test.org" gruppo1 = "test.org"(?:https?) nhóm sơ đồ để áp dụng bộ định lượng ?, nhưng chúng tôi
không quan tâm đến việc trích xuất https thành một nhóm: nhóm 1 trực tiếp là
miền.
Tại sao sử dụng nó
- Dễ đọc: người đọc hiểu ngay rằng nhóm chỉ ở đó để cấu trúc, không phải để trích xuất một giá trị.
- Hiệu suất: động cơ không phải lưu trữ trận đấu của nhóm.
- Đánh số rõ ràng: các nhóm được đánh số luôn thẳng hàng với "thông tin tôi thực sự cần", không có sự can thiệp.
Tối ưu hóa với các nhóm không thu thập
Việc sử dụng (?:...) sẽ yêu cầu công cụ áp dụng các quy tắc nhóm và định lượng mà không lãng phí bộ nhớ khi lưu trữ các kết quả đối sánh trung gian. Điều này rất được khuyến khích trong các vòng lặp nặng hoặc xử lý văn bản rất dài.
Hãy thử nó
Trích xuất tên miền (`example.com`, `test.org`…) từ mọi URL trong văn bản. Sử dụng `(?:https?)` cho giao thức (không cần nắm bắt nó) và một nhóm duy nhất cho miền.
Hiển thị gợi ý
Thay đổi nhóm đầu tiên từ (https?) thành (?:https?): không cần nắm bắt, bạn chỉ muốn tên miền.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Tìm mọi sự lặp lại của `ab` dưới dạng một trận đấu duy nhất, nhưng KHÔNG bắt được nhóm (vì bạn chỉ cần toàn bộ trận đấu).
Hiển thị gợi ý
Cú pháp tương tự như bài học trước, nhưng với (?:ab)+ thay vì (ab)+.
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.
Hiển thị gợi ý
Sử dụng (?:\\.\\d{2})? để làm cho phần thập phân trở thành tùy chọn mà không cần nắm bắt nó.
Giải pháp khả dụng sau 3 lần thử