Regex, der kürzere Spiele innerhalb eines Spiels bevorzugt? (Dies ist mehr beteiligt als nicht gierig)

9

Ich versuche, ein Skript für die Fuzzy-Suche in einem Puffer zu erstellen. Die Hauptidee ist eine Eingabe zu nehmen, und fügen Sie .\{-}zwischen jedem Paar von Zeichen, zB foowird f.\{-}o.\{-}o.

Dies funktioniert ziemlich gut, führt jedoch zu vielen nicht idealen Übereinstimmungen. Ich denke, eine Fuzzy-Suche sollte zuerst die kürzesten Übereinstimmungen ergeben. Betrachten Sie das folgende Beispiel:

public void put()

Wenn Sie eine Fuzzy-Suche nach put(so, p.\{-}u.\{-}t) durchführen, stimmt dies mit der gesamten Zeichenfolge überein public void put, aber die kürzere putinnerhalb dieser Übereinstimmung wäre nützlicher.

Die nicht-gierigen Betreiber sind gut bei den Spielen , dass die Suche nach Ende früher, aber ich brauche etwas, das, zur gleichen Zeit, Streichhölzer , die es vorziehen , beginnen später. Konzeptionell sollte es in beide Richtungen nicht gierig sein. Ist das möglich?

tommcdo
quelle
Siehe auch: stackoverflow.com/q/15191291 (leider keine Antworten auf Ihre Frage)
Doorknob
1
@ Doorknob, keine Antworten, aber es gibt einen guten Punkt: Regex beginnt nicht mit der Suche in der Mitte eines Strings. Möglicherweise muss ich VimScript verwenden, um die Arbeit zu erledigen. Ich untersuche die Idee, die (lange) Übereinstimmung umzukehren und nach dem umgekehrten Muster zu suchen.
Tommcdo
2
Tim Pope hat heute Vim-Heuhaufen veröffentlicht . Es klingt ähnlich wie das, was Sie brauchen. Vielleicht können Sie sich davon inspirieren lassen oder es sogar nutzen.
Tokoyami
1
Ich möchte, dass das Spiel so spät wie möglich beginnt und so früh wie möglich endet, während das Muster weiterhin erfüllt wird.
Tommcdo
1
Sie sollten sich die sogenannten ungefähren String-Matching-Algorithmen ansehen. Sie sind geeignetere Werkzeuge zur Implementierung eines Fuzzy-Finders als reguläre Ausdrücke.
Toro2k

Antworten:

2

Es gibt nicht genug Beispiele, aber ich denke, das macht, was Sie wollen.

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

würde putin Ihrem Beispiel statt passen public void put. Grundsätzlich .*zwingt das die Regex-Engine, die Zeichenfolge rückwärts zu durchsuchen, da .*die gesamte Zeichenfolge zuerst verbraucht und dann zurückverfolgt wird, um die neueste Übereinstimmung von zu findenp.\{-}u.\{-}t

FDinoff
quelle
Ich hatte das schon einmal versucht (aber bis jetzt vergessen). Es ist ziemlich gut, aber es bedeutet, dass es immer nur ein Spiel pro Zeile geben wird (das letztmögliche Spiel). Ich möchte immer noch eine Linie pouty puppet, die zwei Übereinstimmungen ergibt.
Tommcdo