Estou tentando usar um regex para substituir o texto em um arquivo (substitua um URL completo por apenas protocol / domain /):
:%s/\(https\?:\/\/.*?\/\).*/\1/gc
Infelizmente .*?
, não corresponde à string, mesmo tentando escapar do ?
quantificador? Como o quantificador não ganancioso deve ser escapado no vim?
regular-expression
guido
fonte
fonte
:help greedy
o levaria ao tópico de ajuda certo.:help regexp
é a ajuda para descrever o sabor da expressão regular do Vim.Respostas:
A regex do Vim possui sintaxe especial para versões não gananciosas dos operadores (é meio irritante, mas você só precisa memorizá-las): http://vimregex.com/#Non-Greedy
A versão não gananciosa de
*
é\{-}
. Então, basta substituir.*
por.\{-}
:fonte
Prefiro sempre dividir o problema em duas etapas:
Usando "\ v" muito mágico para evitar muitas barras invertidas, referenciando a última pesquisa na substituição e alterando o delimitador de substituição. Todas essas alterações tornam o código mais legível.
fonte
Você também pode usar o
[^\]+/.
para evitar a ganância.[^/]
significa "corresponder a qualquer coisa esperada/
e+
repetir isso uma ou mais vezes ..Se eu tiver
/
no regex, usarei!
como um separador para não precisar escapar/
.Exemplo
Vamos supor que você tenha os seguintes URLs:
Aplicando a substituição, você obteria isso:
fonte