2009-12-17 32 views

Trả lời

116

Đối với một biểu thức chính quy như .* hoặc .+, thêm một dấu chấm hỏi (.*? hoặc .+?) để phù hợp càng ít nhân vật càng tốt. Để tùy chọn đối sánh một phần (?:blah)? nhưng không khớp trừ khi cần thiết, hãy sử dụng một cái gì đó như (?:blah){0,1}?. Đối với đối sánh lặp lại (hoặc sử dụng cú pháp {n,} hoặc {n,m}), hãy thêm dấu hỏi để cố gắng so khớp ít nhất có thể (ví dụ: {3,}? hoặc {5,7}?).

Tài liệu trên regular expression quantifiers cũng có thể hữu ích.

+1

Tôi không biết, nếu tôi là người duy nhất có sự hiểu lầm này, nhưng điều quan trọng cần lưu ý: Trong khi đúng là toán tử không tham lam sẽ khớp với ít ký tự nhất có thể, nó vẫn có thể không khớp với ký tự đang tìm kiếm. "Ít ký tự nhất có thể" không bằng "trận đấu ngắn nhất có thể" về tiêu chuẩn RegEx. Xem câu trả lời bên dưới bình luận của tôi: Với 'abcabk' và' a. +? K', RegEx sẽ khớp với toàn bộ chuỗi. – Jayjayyy

47

Toán tử không tham lam, ?. Cũng giống như vậy:

.*? 
17

Các nhà điều hành không tham lam không có nghĩa là trận đấu ngắn nhất có thể:

abcabk

a.+?k sẽ phù hợp với toàn bộ chuỗi (trong ví dụ này) thay vì chỉ có ba dấu hiệu cuối cùng.

Tôi muốn thực sự tìm thấy kết quả phù hợp nhỏ nhất có thể thay thế.

Đó là trận đấu cuối cùng có thể có cho 'a' để vẫn cho phép tất cả các kết quả phù hợp cho k.

Tôi đoán cách duy nhất để làm điều đó là sử dụng một biểu thức như:

a[^a]+?k 
+1

Hoặc tìm kiếm theo thứ tự ngược lại, bắt đầu từ cuối, khi các kết quả trùng khớp được lồng nhau: "(ab (abk) bk)". – LBogaardt

+5

@LBogaardt cách tìm kiếm theo thứ tự ngược lại? không nhận được nó – azerafati

+1

@LBogaardt Vẫn còn câu hỏi mở: Làm thế nào một tìm kiếm theo thứ tự ngược lại? Cho phép nói rằng tôi muốn có được 'cab'. Nếu đầu vào của tôi là 'caaacab' và tôi tìm kiếm' a. *? B' nó sẽ trả về chuỗi đầy đủ thay vì kết quả khớp ngắn bên trong. Làm thế nào tôi sẽ tìm kiếm ngược từ 'b'? – C4u

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