Bài học theo mô-đun (3/4)
Tham lam vs lười biếng
Theo mặc định, các bộ định lượng là tham lam: chúng tiêu thụ càng nhiều càng tốt
trong khi vẫn giữ mẫu hợp lệ. Thêm ? sau bộ định lượng (*?, +?,
??, {n,m}?) cung cấp cho bạn phiên bản lười biếng: nó tiêu thụ ít nhất là
có thể.
Sample: **uno** e *due*
Greedy pattern <.*> matches: **uno** e *due* (everything)
Lazy pattern <.*?> matches: ** **
* * (4 matches with the g flag)Mẫu giống hệt nhau, chỉ khác một ký tự duy nhất (? được thêm vào
định lượng), kết quả hoàn toàn khác nhau.
Khi nó quan trọng
- Để trích xuất nội dung giữa các dấu phân cách (thẻ HTML, dấu ngoặc kép, trong ngoặc đơn), phiên bản lazy hầu như luôn là phiên bản phù hợp.
- Để khớp đến cuối dòng bạn thường muốn tham lam (
.*).
Chiến lược tham lam và lười biếng trong động cơ
Bộ định lượng tham lam tiêu thụ nhiều văn bản nhất có thể và chỉ quay lại nếu bị ép buộc. Bằng cách thêm ? (lazy), công cụ sẽ tiêu thụ mức tối thiểu tuyệt đối và tiến lên từng ký tự một để tìm kiếm kết quả phù hợp tiếp theo của mẫu.
Hãy thử nó
Trích xuất mọi thẻ HTML từ mẫu (ví dụ: `**`, `**`, `*`, `*`) bằng phiên bản lười biếng `.*?`.
Hiển thị gợi ý
Tham lam <.*> khớp từ đầu thẻ đầu tiên đến cuối thẻ cuối cùng. Lazy <.*?> dừng ở > đầu tiên nó gặp.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Trích xuất mọi chuỗi giữa các dấu ngoặc kép trong văn bản (ví dụ: "ciao", "mondo"). Sử dụng phiên bản lười biếng của bộ định lượng để tránh chuyển sang phần đóng sau này.
Hiển thị gợi ý
".*?" dừng lại ở dấu ngoặc kép đóng đầu tiên.
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.
Hiển thị gợi ý
Sử dụng \\[ cho dấu ngoặc mở, sau đó .*? và cuối cùng \\] cho dấu ngoặc đóng.
Giải pháp khả dụng sau 3 lần thử