Regex che preferisce le partite più brevi all'interno di una partita? (Questo è più coinvolto che non avido)


9

Sto cercando di creare uno script per eseguire ricerche fuzzy all'interno di un buffer. L'idea principale è quella di prendere alcuni input e inserire .\{-}tra ogni coppia di caratteri, ad esempio foodiventa f.\{-}o.\{-}o.

Funziona abbastanza bene, ma presenta molte partite non ideali. Penso che una ricerca confusa dovrebbe produrre prima le corrispondenze più brevi. Considera il seguente esempio:

public void put()

Fare una ricerca fuzzy per put(così, p.\{-}u.\{-}t) corrisponderà all'intera stringa public void put, ma il più breve putall'interno di quella corrispondenza sarebbe più utile.

L'operatore non avido è bravo a trovare le partite che finiscono prima, ma ho bisogno di qualcosa che possa, allo stesso tempo, preferire le partite che iniziano più tardi. Concettualmente, dovrebbe essere non avido in entrambe le direzioni. È possibile?


Vedi anche: stackoverflow.com/q/15191291 (purtroppo nessuna risposta alla tua domanda)
Doorknob

1
@Doorknob, nessuna risposta, ma solleva un buon punto: Regex non inizia la ricerca dal centro di una stringa. Potrei dover coinvolgere un po 'di VimScript per fare il lavoro. Sto esplorando l'idea di invertire la (lunga) corrispondenza e cercarla per il modello invertito.
Tommaso,

2
Tim Pope ha rilasciato Vim-pagliaio oggi. Sembra simile a quello che ti serve. Forse puoi trarre ispirazione da esso o forse anche usarlo.
Tokoyami,

1
Voglio che la partita inizi il più tardi possibile e finisca il più presto possibile, pur soddisfacendo lo schema.
Tommaso

1
Dovresti dare un'occhiata ai cosiddetti algoritmi approssimativi di corrispondenza delle stringhe , sono strumenti più appropriati per implementare un fuzzy finder rispetto a regexps.
toro2k,

Risposte:


2

Non ci sono abbastanza esempi ma penso che questo faccia quello che vuoi.

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

corrisponderebbe putnel tuo esempio anziché public void put. Fondamentalmente .*costringe il motore regex a iniziare a cercare la stringa all'indietro, poiché .*consuma prima l'intera stringa e poi torna indietro, per trovare l'ultima corrispondenza dip.\{-}u.\{-}t


L'avevo provato prima (ma ho dimenticato fino ad ora). È abbastanza buono, ma significa che ci sarà sempre e solo una corrispondenza per riga (l'ultima partita possibile). Vorrei comunque che una linea mi piacesse pouty puppetprodurre due partite.
martedì
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.