Làm cách nào để yêu cầu RegEx (phiên bản .NET) nhận được kết quả phù hợp hợp lệ nhỏ nhất thay vì lớn nhất?
Làm cách nào để yêu cầu RegEx (phiên bản .NET) nhận được kết quả phù hợp hợp lệ nhỏ nhất thay vì lớn nhất?
Câu trả lời:
Đố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.
Người điều hành không tham lam , ?
. Như vậy:
.*?
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
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ì khớp ngắn bên trong. Làm thế nào tôi sẽ tìm kiếm ngược từ b
?
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"
abcabk
vàa.+?k
, RegEx sẽ khớp với toàn bộ chuỗi.