¿Cómo hacer que las expresiones regulares no sean codiciosas?

19

Estoy tratando de usar una expresión regular para reemplazar el texto en un archivo (reemplace una URL completa con solo protocolo / dominio /):

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

Lamentablemente .*?no coincide con la cadena, incluso tratando de escapar del ?cuantificador? ¿Cómo se debe escapar el cuantificador no codicioso en vim?

guido
fuente
2
:help greedyte habría llevado al tema de ayuda correcto. :help regexpes la ayuda que describe el sabor regex de Vim.
jamessan

Respuestas:

26

La expresión regular de Vim tiene una sintaxis especial para las versiones no codiciosas de los operadores (es un poco molesto, pero solo tienes que memorizarlas): http://vimregex.com/#Non-Greedy

La versión no codiciosa de *es \{-}. Entonces, simplemente reemplace .*con .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc
Perilla de la puerta
fuente
6

Prefiero siempre dividir el problema en dos pasos:

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

Usando "\ v" muy mágico para evitar muchas barras invertidas, haciendo referencia a la última búsqueda en sustitución y cambiando el delimitador de sustitución. Todos estos cambios hacen que el código sea más legible.

ingrese la descripción de la imagen aquí

SergioAraujo
fuente
2

También puede usar el [^\]+/.para evitar la codicia. [^/]significa "igualar todo lo que se espera /, y lo +repite una o más veces ..

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

Si tengo /en la expresión regular, lo usaré !como separador para no tener que escapar /.

Ejemplo

Supongamos que tiene las siguientes 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/

Aplicando la sustitución obtendría eso:

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
fuente