Como fazer com que os regex matchers não sejam gananciosos?

18

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?

guido
fonte
2
:help greedyo levaria ao tópico de ajuda certo. :help regexpé a ajuda para descrever o sabor da expressão regular do Vim.
21415 jamessan

Respostas:

25

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 .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc
Maçaneta
fonte
5

Prefiro sempre dividir o problema em duas etapas:

/\v(https?):\/\/(.{-})\/.*        <-- Search
:%s,,Protocol:\1 - Domain:\2,g    <-- Substitution

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.

insira a descrição da imagem aqui

SergioAraujo
fonte
2

Você também pode usar o [^\]+/.para evitar a ganância. [^/]significa "corresponder a qualquer coisa esperada /e +repetir isso uma ou mais vezes ..

:%s!\v^(https?)\://([^/]+)/.*$!Protocol:\1 \t Domain:\2!g

Se eu tiver /no regex, usarei !como um separador para não precisar escapar /.

Exemplo

Vamos supor que você tenha os seguintes URLs:

http://academy.mises.org/courses/econgd/
http://academy.mises.org/moodle/course/view.php?id=172
http://acmsel.safaribooksonline.com/book/-/9781449358204?bookview=overview
http://acmsel.safaribooksonline.com/home
http://acordes.lacuerda.net/bebo__cigala/lagrimas_negras-2.shtml
http://acordes.lacuerda.net/jose_antonio_labordeta/albada.shtml
http://anarchitext.wordpress.com/category/new-middle-east/
https://courses.edx.org/courses/course-v1%3ADelftX%2BFP101x%2B3T2015/wiki/DelftX.FP101x.3T2015/resources-and-links/
https://cseweb.ucsd.edu/classes/wi11/cse230/lectures.html
https://developer.mozilla.org/en-US/docs/CSS
https://developers.google.com/edu/python
https://developers.google.com/structured-data/testing-tool/

Aplicando a substituição, você obteria isso:

Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:anarchitext.wordpress.com
Protocol:https   Domain:courses.edx.org
Protocol:https   Domain:cseweb.ucsd.edu
Protocol:https   Domain:developer.mozilla.org
Protocol:https   Domain:developers.google.com
Protocol:https   Domain:developers.google.com
Samir Sadek
fonte