Jak sprawić, by dopasowujące wyrażenia regularne nie były zachłanne?

20

Próbuję użyć wyrażenia regularnego do zamiany tekstu w pliku (zastąp pełny adres URL tylko protokołem / domeną /):

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

Niestety .*?nie pasuje do ciągu, nawet próbując uciec przed ?kwantyfikatorem? W jaki sposób należy uchylić niepochodny kwantyfikator w vimie?

guido
źródło
2
:help greedyzabrałby Cię do właściwego tematu pomocy. :help regexpto pomoc opisująca smak regularny Vima.
jamessan

Odpowiedzi:

27

Wyrażenie regularne Vima ma specjalną składnię dla niechcianych wersji operatorów (to trochę denerwujące, ale musisz je zapamiętać): http://vimregex.com/#Non-Greedy

Nie-chciwa wersja *to \{-}. Tak, po prostu zastąpić .*z .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc
Klamka
źródło
6

Wolę zawsze rozkładać problem na dwa etapy:

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

Używanie bardzo magicznego „\ v”, aby uniknąć wielu odwrotnych ukośników, odwoływanie się do ostatniego wyszukiwania w podstawianiu i zmiana ogranicznika podstawiania. Wszystkie te zmiany sprawiają, że kod jest bardziej czytelny.

wprowadź opis zdjęcia tutaj

SergioAraujo
źródło
2

Możesz także użyć, [^\]+/.aby zapobiec zachłanności. [^/]oznacza „dopasuj wszystko /, czego oczekujesz , i +powtarza to jeden lub więcej razy.

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

Jeśli mam /wyrażenie regularne, użyję go !jako separatora, aby nie musiałem uciekać /.

Przykład

Załóżmy, że masz następujące adresy 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/

Stosując substytucję, otrzymasz:

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
źródło