Chuyển đến nội dung chính
Mô-đun 4 · Bài học 3 trong tổng số 415/32 trong khóa học~10 min
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ố.

Code
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ó

  1. 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ị.
  2. Hiệu suất: động cơ không phải lưu trữ trận đấu của nhóm.
  3. Đá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ó

tập thể dục#regex.m4.l3.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ập thể dục#regex.m4.l3.e2
Nỗ lực: 0Đang tải…

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).

Đang tải trình chỉnh sửa…
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

tập thể dục#regex.m4.l3.e3
Nỗ lực: 0Đang tải…

Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.

Đang tải trình chỉnh sửa…
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ử