Regexes thường khớp từ trái sang phải trừ khi bạn đặt cờ từ phải sang trái (rất ít hỗ trợ hương vị). Trong cả hai trường hợp, chúng không bắt đầu ở giữa và sau đó làm việc theo cả hai hướng, ngay cả khi bạn sử dụng một lookbehind.
Giúp dừng và hỏi - tại sao số liệu định lượng lười biếng tồn tại ở vị trí đầu tiên? Vấn đề là gì để giải quyết?
Công cụ định lượng thông thường (tham lam) hoạt động bằng cách tìm mẫu văn bản phù hợp và sau đó liên tục khớp chuỗi ký tự cho đến khi chúng không khớp được nữa. Hành vi này thường được mong muốn, nhưng bạn gặp phải các vấn đề khi bạn có một mẫu rất chung theo sau là một mẫu rất cụ thể trong đó mẫu cụ thể là một tập hợp con của mẫu chung.
Ví dụ, hãy xem xét đầu vào sau:
_abc_END_def_END
Và mô hình này:
(\w+END)(\w+END)?
Mục đích, nó rất dễ dàng để giả định, là để phù hợp với _abc_
và sau đó END
, tiếp theo là _def_
và sau đó END
. Biểu thức này sẽ xuất hiện để cho phép đầu vào trong đó tập ký tự thứ hai là tùy chọn.
Vấn đề là END
là một tập hợp con của \w+
, vì vậy tập thứ hai là thực sự "tiêu thụ" bởi \w+
, dẫn đến _abc_END_def_
bị phù hợp, tiếp theo là END
. Đây không phải là hành vi mong muốn.
Giải pháp cho kịch bản này là thay đổi cách trình định lượng hoạt động với công cụ sửa đổi chậm. Điều này cung cấp cho mô hình END
một cơ hội để khớp với mỗi ký tự và chỉ cho phép \w+
tiêu thụ một ký tự khác nếu END
không thành công.
Mục đích của trình định lượng lười không khớp với số ký tự "tối thiểu" - đó là về việc đưa mẫu thứ hai đó, một tập hợp con đầu tiên, một cơ hội để khớp.
Trong ví dụ của bạn, b
không phải là tập hợp con của a
, vì vậy không cần thiết cho trình định lượng lười. Nếu bạn muốn kết hợp một hoặc nhiều hơn một, nhưng càng ít càng tốt, và một hoặc nhiều b, nhưng càng ít càng tốt, sau đó bạn chỉ đơn giản là muốn sử dụng:
ab
Hoặc, nếu bạn a
là một lập trường -trong đối với một số siêu có thể bao gồm b:
[ab]b
Ví dụ:
\wb
Cả hai trong số đó sẽ phù hợp:
ab
Tôi muốn biết một cách tổng quát về cách để có được càng ít dưới dạng kết hợp có thể ở phía bên trái với 'a'. Tất nhiên, đây chỉ là một ví dụ. – flori
Bạn có thể đưa ra một ví dụ hợp lý không? Sau đó, nó có thể có thể cho bạn thấy một giải pháp có ý nghĩa. –
@flori: Bạn cần bằng cách nào đó từ chối trận đấu 'aaaaaab', 'aaaaab', ...' aab', để khớp 'ab', nếu đó là điều bạn muốn. Trong trường hợp này, tôi sẽ đi với 'indexOf (" ab ")'. – nhahtdh