Regex, który woli krótsze mecze w meczu? (Jest to bardziej zaangażowane niż niechciane)

9

Próbuję utworzyć skrypt do przeprowadzania wyszukiwania rozmytego w buforze. Główną ideą jest pobranie danych i wstawienie .\{-}między każdą parą znaków, np . fooStaje się f.\{-}o.\{-}o.

Działa to dość dobrze, ale pojawia się wiele nieprzystosowanych dopasowań. Myślę, że wyszukiwanie rozmyte powinno najpierw dać najkrótsze dopasowania. Rozważ następujący przykład:

public void put()

Wykonanie wyszukiwania rozmytego dla put(tak, p.\{-}u.\{-}t) dopasuje cały ciąg public void put, ale krótsze putw tym dopasowaniu byłoby bardziej przydatne.

Nie chciwy operator jest dobry w znajdowaniu meczów, które kończą się wcześniej, ale potrzebuję czegoś, co może jednocześnie preferować mecze rozpoczynające się później. Pod względem koncepcyjnym powinno być niechciane w obu kierunkach. czy to możliwe?

tommcdo
źródło
Zobacz także: stackoverflow.com/q/15191291 (niestety nie ma odpowiedzi na twoje pytanie)
Klamka
1
@Doorknob, brak odpowiedzi, ale podnosi dobrą rację: Regex nie rozpoczyna wyszukiwania od środka łańcucha. Być może będę musiał zaangażować trochę VimScript, aby wykonać zadanie. Badam pomysł odwrócenia (długiego) dopasowania i szukam w nim odwróconego wzorca.
tommcdo
2
Tim Pope wydał dzisiaj vim-haystack . Brzmi podobnie do tego, czego potrzebujesz. Może możesz czerpać z tego inspirację, a może nawet z niej skorzystać.
tokoyami
1
Chcę, aby mecz rozpoczął się tak późno, jak to możliwe, i zakończył tak wcześnie, jak to możliwe, przy jednoczesnym zachowaniu zgodności ze schematem.
tommcdo
1
Powinieneś spojrzeć na tak zwane algorytmy przybliżonego dopasowywania łańcucha , są one bardziej odpowiednimi narzędziami do implementacji zamazanej wyszukiwarki niż wyrażeń regularnych.
toro2k

Odpowiedzi:

2

Nie ma wystarczającej liczby przykładów, ale myślę, że robi to, co chcesz.

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

będzie pasować putw twoim przykładzie zamiast public void put. Zasadniczo .*zmusza silnik regex do rozpoczęcia wyszukiwania łańcucha do tyłu, ponieważ .*najpierw zużywa cały łańcuch, a następnie cewki, aby znaleźć najnowsze dopasowaniep.\{-}u.\{-}t

FDinoff
źródło
Próbowałem już wcześniej (ale do tej pory zapomniałem). Jest całkiem niezły, ale oznacza to, że zawsze będzie jeden mecz na linię (ostatni możliwy mecz). Nadal chciałbym linię, pouty puppetktóra dałaby dwa dopasowania.
tommcdo