Regex thích các trận đấu ngắn hơn trong một trận đấu? (Điều này liên quan nhiều hơn là không tham lam)


9

Tôi đang cố gắng tạo một tập lệnh để thực hiện tìm kiếm mờ bên trong bộ đệm. Ý tưởng chính là lấy một số đầu vào và chèn .\{-}giữa mỗi cặp ký tự, ví dụ như footrở thành f.\{-}o.\{-}o.

Điều này hoạt động khá tốt, nhưng đi kèm với rất nhiều trận đấu không lý tưởng. Tôi nghĩ rằng một tìm kiếm mờ sẽ mang lại kết quả phù hợp ngắn nhất trước tiên. Hãy xem xét ví dụ sau:

public void put()

Thực hiện tìm kiếm mờ cho put(vì vậy, p.\{-}u.\{-}t) sẽ khớp với toàn bộ chuỗi public void put, nhưng ngắn hơn puttrong kết quả khớp đó sẽ hữu ích hơn.

Nhà điều hành không tham lam rất giỏi trong việc tìm kiếm các trận đấu kết thúc sớm hơn, nhưng tôi cần một cái gì đó có thể, đồng thời, thích các trận đấu bắt đầu sau đó. Về mặt khái niệm, nó không nên tham lam theo cả hai hướng. Điều này có thể không?


Xem thêm: stackoverflow.com/q/15191291 (không có câu trả lời cho câu hỏi của bạn, thật không may)
Doorknob

1
@Doorknob, không có câu trả lời, nhưng nó nêu lên một điểm tốt: Regex không bắt đầu tìm kiếm từ giữa chuỗi. Tôi có thể phải liên quan đến một số VimScript để hoàn thành công việc. Tôi đang khám phá ý tưởng đảo ngược trận đấu (dài) và tìm kiếm nó cho mẫu đảo ngược.
tommcdo 4/2/2015

2
Tim Pope đã phát hành vim-haystack ngày hôm nay. Nghe có vẻ giống như những gì bạn cần. Có lẽ bạn có thể lấy một số cảm hứng từ nó hoặc thậm chí có thể sử dụng nó.
tokoyami

1
Tôi muốn trận đấu bắt đầu càng sớm càng tốt và kết thúc sớm nhất có thể, trong khi vẫn thỏa mãn mô hình.
tommcdo 7/2/2015

1
Bạn nên xem các thuật toán khớp chuỗi gần đúng , chúng là các công cụ thích hợp hơn để thực hiện một công cụ tìm mờ hơn regexps.
toro2k 16/2/2015

Câu trả lời:


2

Không có đủ ví dụ nhưng tôi nghĩ rằng điều này làm những gì bạn muốn.

.*\zsp.\{-}u.\{-}t

sẽ phù hợp puttrong ví dụ của bạn thay vì public void put. Về cơ bản, .*buộc công cụ regex bắt đầu tìm kiếm chuỗi ngược, vì trước tiên .*tiêu thụ toàn bộ chuỗi sau đó quay lại, để tìm kết quả khớp mới nhất củap.\{-}u.\{-}t


Tôi đã thử điều này trước đây (nhưng quên cho đến bây giờ). Nó khá tốt, nhưng điều đó có nghĩa là sẽ chỉ có một trận đấu trên mỗi dòng (trận đấu cuối cùng có thể). Tôi vẫn muốn một dòng như pouty puppetmang lại hai trận đấu.
tommcdo
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.