Regex yang lebih suka pertandingan yang lebih pendek dalam suatu pertandingan? (Ini lebih terlibat daripada tidak serakah)

9

Saya mencoba membuat skrip untuk melakukan pencarian fuzzy di dalam buffer. Gagasan utamanya adalah mengambil beberapa input, dan menyisipkan di .\{-}antara setiap pasangan karakter, misalnya foomenjadi f.\{-}o.\{-}o.

Ini bekerja cukup baik, tetapi muncul dengan banyak pertandingan yang tidak ideal. Saya pikir pencarian fuzzy harus menghasilkan kecocokan terpendek terlebih dahulu. Perhatikan contoh berikut:

public void put()

Melakukan pencarian fuzzy untuk put(jadi, p.\{-}u.\{-}t) akan cocok dengan seluruh string public void put, tetapi lebih pendek putdalam pertandingan itu akan lebih berguna.

Operator yang tidak rakus itu pandai menemukan kecocokan yang berakhir lebih awal, tetapi saya perlu sesuatu yang, pada saat yang sama, lebih suka kecocokan yang dimulai nanti. Secara konseptual, itu harus tidak rakus di kedua arah. Apakah ini mungkin?

tommcdo
sumber
Lihat juga: stackoverflow.com/q/15191291 (sayangnya, tidak ada jawaban untuk pertanyaan Anda)
Doorknob
1
@ Doorknob, tidak ada jawaban, tapi itu meningkatkan poin bagus: Regex tidak mulai mencari dari tengah-tengah string. Saya mungkin harus melibatkan beberapa VimScript untuk menyelesaikan pekerjaan. Saya mengeksplorasi ide untuk membalikkan pertandingan (lama), dan mencari untuk pola yang terbalik.
tommcdo
2
Tim Pope merilis vim-haystack hari ini. Kedengarannya mirip dengan yang Anda butuhkan. Mungkin Anda bisa mendapatkan inspirasi darinya atau bahkan menggunakannya.
tokoyami
1
Saya ingin pertandingan dimulai selambat mungkin dan berakhir sedini mungkin, sambil tetap memenuhi polanya.
tommcdo
1
Anda harus melihat apa yang disebut algoritma pencocokan string perkiraan , mereka adalah alat yang lebih tepat untuk menerapkan pencari fuzzy daripada regexps.
toro2k

Jawaban:

2

Tidak ada cukup contoh tetapi saya pikir ini melakukan apa yang Anda inginkan.

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

akan cocok putdengan contoh Anda, bukan public void put. Pada dasarnya .*memaksa mesin regex untuk mulai mencari string ke belakang, karena .*mengkonsumsi seluruh string terlebih dahulu kemudian backtracks, untuk menemukan kecocokan terbaru darip.\{-}u.\{-}t

FDinoff
sumber
Saya sudah mencoba ini sebelumnya (tetapi lupa sampai sekarang). Ini cukup bagus, tetapi itu berarti bahwa hanya akan ada satu pertandingan per baris (pertandingan terakhir yang mungkin). Saya masih ingin garis ingin pouty puppetmenghasilkan dua pertandingan.
tommcdo