Regex que prefere correspondências mais curtas dentro de uma correspondência? (Isso é mais envolvido do que não ganancioso)


9

Estou tentando criar um script para executar a pesquisa difusa dentro de um buffer. A idéia principal é pegar alguma entrada e inserir .\{-}entre cada par de caracteres, por exemplo, footorna-se f.\{-}o.\{-}o.

Isso funciona bastante bem, mas gera muitas correspondências não ideais. Acho que uma pesquisa difusa deve produzir as correspondências mais curtas primeiro. Considere o seguinte exemplo:

public void put()

Fazer uma pesquisa difusa por put(então, p.\{-}u.\{-}t) corresponderá a toda a cadeia public void put, mas a menor putdentro dessa correspondência seria mais útil.

O operador não ganancioso é bom em encontrar correspondências que terminam mais cedo, mas eu preciso de algo que possa, ao mesmo tempo, preferir correspondências que começam mais tarde. Conceitualmente, não deve ser ganancioso nas duas direções. Isso é possível?


Veja também: stackoverflow.com/q/15191291 (nenhuma resposta para a sua pergunta, porém, infelizmente)
Doorknob

11
@ Doorknob, sem respostas, mas levanta um bom ponto: o Regex não inicia a pesquisa no meio de uma string. Talvez eu precise envolver algum VimScript para fazer o trabalho. Estou explorando a idéia de reverter a correspondência (longa) e pesquisando-a pelo padrão invertido.
tommcdo

2
Tim Pope lançou hoje o vim-palheiro . Parece semelhante ao que você precisa. Talvez você possa se inspirar ou até usá-lo.
5135 tokoyami

11
Quero que a partida comece o mais tarde possível e termine o mais cedo possível, enquanto ainda satisfaz o padrão.
Tommcdo

11
Você deve dar uma olhada nos chamados algoritmos de correspondência aproximada de cadeia , eles são ferramentas mais apropriadas para implementar um localizador nebuloso do que regexps.
toro2k 16/02

Respostas:


2

Não há exemplos suficientes, mas acho que isso faz o que você deseja.

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

corresponderia putno seu exemplo em vez de public void put. Basicamente, .*obriga o mecanismo regex a começar a pesquisar a string para trás, pois .*consome a string inteira primeiro e depois recua, para encontrar a última correspondência dep.\{-}u.\{-}t


Eu já tinha tentado isso antes (mas esqueci até agora). É muito bom, mas significa que sempre haverá uma partida por linha (a última partida possível). Eu ainda gostaria de uma linha que gostaria pouty puppetde render duas partidas.
27415 Tommcdo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.