RegEx: Trận đấu nhỏ nhất có thể hoặc trận đấu không tham gia


Câu trả lời:


192

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

Tài liệu về bộ định lượng biểu thức chính quy cũng có thể hữu ích.


7
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 ý: Mặc dù đúng là toán tử không tham lam sẽ khớp với càng ít ký tự càng tốt, nó vẫn có thể không phải là khớp mà người ta đang tìm kiếm cho. "Càng ít ký tự càng tốt" không bằng "khớp ngắn nhất có thể" liên quan đến các tiêu chuẩn của RegEx. Xem câu trả lời bên dưới nhận xét của tôi: Với abcabka.+?k, RegEx sẽ khớp với toàn bộ chuỗi.
finefoot

Dòng2 "nhưng không khớp trừ khi thực sự cần thiết": Điều này có nghĩa là gì?
Mưa


45

Toán tử không tham lam không có nghĩa là so khớp ngắn nhất có thể:

abcabk

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

Thay vào đó, tôi muốn thực sự tìm ra kết quả phù hợp nhỏ nhất có thể.

Đó là trận đấu cuối cùng có thể xảy ra để ' a' vẫn cho phép tất cả các trận đấu 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


2
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ả khớp được lồng vào nhau: "(ab (abk) bk)".
LBogaardt

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

2
@LBogaardt Vẫn còn câu hỏi mở: Làm thế nào để tìm kiếm theo thứ tự ngược lại? Hãy nói rằng tôi muốn có được cab. Nếu đầu vào của tôi là caaacabvà tôi tìm kiếm a.*?bnó sẽ trả về chuỗi đầy đủ thay vì khớp ngắn bên trong. Làm thế nào tôi sẽ tìm kiếm ngược từ b?
C4d

3
Đảo ngược chuỗi, sau đó áp dụng regex.
Jonathan Allen,

3
Điều này rất hữu ích. Đối với những người như tôi đang cố gắng hiểu những gì đang xảy ra ở đây, biểu mẫu chung là START[^START]*?END(trong đó START và END là regex của ký tự bắt đầu và kết thúc của bạn). Nó chủ yếu có nghĩa là "trận đấu bất cứ điều gì từ START đến END nơi ở giữa ký tự không bao gồm bắt đầu lại"
derekantrican
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.