Regex que prefiere partidos más cortos dentro de un partido? (Esto es más complicado que no codicioso)


9

Estoy tratando de crear un script para realizar búsquedas difusas dentro de un búfer. La idea principal es tomar algo de entrada e insertar .\{-}entre cada par de caracteres, por ejemplo, se fooconvierte f.\{-}o.\{-}o.

Esto funciona bastante bien, pero genera muchas coincidencias no ideales. Creo que una búsqueda difusa debería producir primero las coincidencias más cortas. Considere el siguiente ejemplo:

public void put()

Hacer una búsqueda difusa para put(entonces p.\{-}u.\{-}t) coincidirá con la cadena completa public void put, pero el más corto putdentro de esa coincidencia sería más útil.

El operador no codicioso es bueno para encontrar coincidencias que terminen antes, pero necesito algo que pueda, al mismo tiempo, preferir coincidencias que comiencen más tarde. Conceptualmente, no debe ser codicioso en ambas direcciones. es posible?


Ver también: stackoverflow.com/q/15191291 (desafortunadamente no hay respuestas para su pregunta)
Doorknob

1
@Doorknob, no hay respuestas, pero plantea un buen punto: Regex no comienza a buscar desde el medio de una cadena. Puede que tenga que involucrar algunos VimScript para hacer el trabajo. Estoy explorando la idea de invertir la coincidencia (larga) y buscando el patrón invertido.
tommcdo

2
Tim Pope lanzó vim-haystack hoy. Suena similar a lo que necesitas. Tal vez puedas inspirarte o incluso usarlo.
tokoyami

1
Quiero que el partido comience lo más tarde posible y termine lo antes posible, sin dejar de satisfacer el patrón.
tommcdo

1
Debes echar un vistazo a los llamados algoritmos aproximados de coincidencia de cadenas , son herramientas más apropiadas para implementar un buscador difuso que las expresiones regulares.
toro2k

Respuestas:


2

No hay suficientes ejemplos, pero creo que esto hace lo que quieres.

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

coincidiría puten su ejemplo en lugar de public void put. Básicamente, .*obliga al motor regex a comenzar a buscar la cadena hacia atrás, ya que .*primero consume toda la cadena y luego retrocede, para encontrar la última coincidencia dep.\{-}u.\{-}t


Había intentado esto antes (pero lo olvidé hasta ahora). Es bastante bueno, pero significa que solo habrá una coincidencia por línea (la última coincidencia posible). Todavía me gustaría una línea como pouty puppetpara producir dos partidos.
tommcdo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.