2012-08-10 29 views
191

Tôi cần trợ giúp về đối sánh cụm từ thông dụng với tùy chọn không tham lam.Làm thế nào tôi có thể viết một regex phù hợp với không tham lam?

Các mô hình phù hợp là:

<img\s.*> 

Các văn bản để phù hợp là:

<html> 
<img src="test"> 
abc 
<img 
    src="a" src='a' a=b> 
</html> 

tôi thử nghiệm trên http://regexpal.com

biểu hiện này phù hợp với tất cả các văn bản từ <img kéo >. Tôi cần nó để phù hợp với lần đầu tiên gặp phải > sau khi <img ban đầu, vì vậy ở đây tôi cần phải nhận được hai kết quả phù hợp thay vì một trong đó tôi nhận được.

Tôi đã thử tất cả các kết hợp của không tham lam ?, không thành công.

+5

Ngôn ngữ nào bạn đang chạy REGEX? – Utkanos

+0

Bản sao có thể có của [RegEx khớp với các thẻ mở trừ các thẻ khép kín XHTML] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Trả lời

278

Không tham lam ? hoạt động hoàn toàn tốt. Bạn chỉ cần chọn chấm khớp với tất cả các tùy chọn trong các công cụ regex (regexpal, công cụ bạn đã sử dụng, cũng có tùy chọn này) mà bạn đang thử nghiệm. Điều này là do, động cơ regex thường không khớp với ngắt dòng khi bạn sử dụng .. Bạn cần phải nói với họ một cách rõ ràng rằng bạn muốn kết hợp dòng-chia quá với .

Ví dụ,

<img\s.*?> 

hoạt động tốt!

Kiểm tra results here.

Ngoài ra, hãy đọc về how dot behaves trong các hương vị regex khác nhau.

+12

Có cũng là một mẹo bạn có thể làm để giải quyết vấn đề này: Vì \ s có nghĩa là "bất kỳ khoảng trống nào" và "\ S" có nghĩa là "bất kỳ khoảng trống nào", [\ s \ S] sẽ khớp với bất kỳ ký tự nào (như ".") bao gồm cả dòng mới)! Tương tự, bạn có thể sử dụng [\ d \ D] hoặc [\ w \ W].Đây có thể là một "hack" khá tiện dụng, và nó chắc chắn là một mẹo rất hữu ích để nhận thức được. –

+3

Hoặc thậm chí, trong ví dụ này, bạn có thể sử dụng: '] *>' để đạt được cùng một ảnh hưởng: vì "Bất kỳ ký tự nào khác'> '" KHÔNG bao gồm dòng mới! –

+1

câu trả lời hay, nhưng làm thế nào về bash? echo " bla " | grep -P '' khớp với toàn bộ chuỗi mặc dù? nhà điều hành. –

47

Toán hạng ? làm cho trận đấu không tham lam. Ví dụ. .* là tham lam trong khi .*? thì không. Vì vậy, bạn có thể sử dụng một cái gì đó như <img.*?> để khớp với toàn bộ thẻ. Hoặc <img[^>]*>.

Nhưng hãy nhớ rằng toàn bộ tập hợp HTML không thực sự được phân tích cú pháp với các cụm từ thông dụng.

+3

Câu trả lời của bạn nhắc nhở về điều này: http://stackoverflow.com/a/1732454/431 –

+2

Tôi nghĩ rõ ràng hơn là nên nói rằng '* ? 'là phiên bản không tham lam của' * '. – golopot

2

Kiểm tra câu hỏi tràn ngăn xếp What do lazy and greedy mean in the context of regular expressions?.

Tham lam có nghĩa là phù hợp với chuỗi dài nhất có thể.

Phương tiện lười phù hợp với chuỗi ngắn nhất có thể.

Ví dụ: tham số h + + khớp với 'địa ngục' trong 'hello', nhưng chữ h lười +. L khớp với 'hel'.

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