Comment rendre les allumeurs regex non gourmands?

20

J'essaie d'utiliser une expression régulière pour remplacer le texte dans un fichier (remplacez une URL complète par juste protocole / domaine /):

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

Malheureusement, .*?ne correspond pas à la chaîne, même en essayant d'échapper au ?quantificateur? Comment échapper un quantificateur non gourmand dans vim?

guido
la source
2
:help greedyvous aurait conduit au bon sujet d'aide. :help regexpest l'aide décrivant l'arôme regex de Vim.
jamessan

Réponses:

27

L'expression régulière de Vim a une syntaxe spéciale pour les versions non gourmandes des opérateurs (c'est un peu ennuyeux, mais il suffit de les mémoriser): http://vimregex.com/#Non-Greedy

La version non gourmande de *is \{-}. Donc, remplacez simplement .*par .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc
Poignée de porte
la source
6

Je préfère toujours diviser le problème en deux étapes:

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

Utiliser le "\ v" très magique pour éviter de nombreuses barres obliques inverses, référencer la dernière recherche en substitution et changer le délimiteur de substitution. Toutes ces modifications rendent le code plus lisible.

entrez la description de l'image ici

SergioAraujo
la source
2

Vous pouvez également utiliser le [^\]+/.pour éviter la gourmandise. [^/]signifie "correspondre à tout ce que vous attendez /, et le +répète une ou plusieurs fois ..

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

Si je l'ai /dans l'expression régulière, je vais l'utiliser !comme séparateur pour ne pas avoir à m'échapper /.

Exemple

Supposons que vous ayez les URL suivantes:

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/

En appliquant la substitution, vous obtiendriez que:

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
la source