2016-04-03 16 views
6

Giả sử tôi đang tìm các liên kết anchor trong một trang web. Một regex hoạt động là:Biểu hiện regex của tôi vừa lười biếng vừa tham lam. Tại sao?

"\<a\s+.*?\>" 

Tuy nhiên, hãy thêm một biến chứng. Giả sử tôi chỉ muốn các liên kết bao quanh văn bản cụ thể, ví dụ, từ 'next'. Thông thường, tôi sẽ nghĩ rằng tất cả tôi phải làm là:

"\<a\s+.*?\>next" 

Nhưng tôi thấy rằng bây giờ, nếu có 3 thẻ neo trong một trang, và một phần ba có 'bên cạnh' sau nó, đó là việc tìm kiếm regex tìm thấy một chuỗi lớn mở rộng từ thẻ neo đầu tiên và mở rộng đến thẻ neo thứ ba. Điều này có ý nghĩa nếu dấu chấm câu-dấu hỏi chấm tìm tất cả các ký tự cho đến khi nó xuất hiện trên "> tiếp theo". Nhưng đó không phải là điều tôi muốn. Tôi muốn tìm tất cả các ký tự cho đến khi nó đi qua ">", và sau đó một hạn chế bổ sung nên được rằng ngay sau khi "" "nên có" tiếp theo ".

Tôi làm cách nào để hoạt động?

Trả lời

6

Bạn có thể sửa regex của bạn bằng cách cấm nó từ phù hợp với > bên trong thẻ, ví dụ bằng cách thay thế . với [^>]:

"\<a\s+[^>]*?\>next" 

.*? khớp với bất kỳ số lượng ký tự. Thực tế là bạn đã làm cho nó miễn cưỡng không làm cho nó dừng lại tại >: nó tiếp tục phù hợp với nó qua, cho đến khi nó tìm thấy >next ở cuối. Đây không phải là tham lam, bởi vì biểu thức phù hợp càng ít càng tốt để có được một trận đấu. Nó chỉ là không có trận đấu ngắn hơn có sẵn.

Demo.

Các vấn đề liên quan