Come rendere i matcher regex non avidi?


19

Sto cercando di usare un regex per sostituire il testo in un file (sostituire un URL completo con solo protocollo / dominio /):

:%s/\(https\?:\/\/.*?\/\).*/\1/gc

Purtroppo .*?non corrisponde alla stringa, anche cercando di sfuggire al ?quantificatore? Come si dovrebbe sfuggire a quantificatore non avido?


2
:help greedyti avrebbe portato all'argomento di aiuto giusto. :help regexpè l'aiuto che descrive il sapore regex di Vim.
Jamessan,

Risposte:


26

La regex di Vim ha una sintassi speciale per le versioni non avide degli operatori (è un po 'fastidioso, ma devi solo memorizzarle): http://vimregex.com/#Non-Greedy

La versione non avida di *è \{-}. Quindi, sostituisci semplicemente .*con .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc

6

Preferisco sempre suddividere il problema in due passaggi:

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

Usando "\ v" molto magico per evitare molte barre rovesciate, facendo riferimento all'ultima ricerca nella sostituzione e cambiando il delimitatore della sostituzione. Tutte queste modifiche rendono il codice più leggibile.

inserisci qui la descrizione dell'immagine


2

Puoi anche usare il [^\]+/.per prevenire l'avidità. [^/]significa "abbina tutto ciò che ti aspetti /e lo +ripete una o più volte.

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

Se ho /nel regex, userò !come separatore in modo da non dover scappare /.

Esempio

Supponiamo che tu abbia i seguenti URL:

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/

Applicando la sostituzione si otterrebbe questo:

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
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.