Как сделать регулярные выражения не жадными?

19

Я пытаюсь использовать регулярные выражения для замены текста в файле (заменить полный URL-адрес просто протокол / домен /):

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

К сожалению .*?не совпадает строка, даже пытаясь уйти от ?квантификатора? Как избежать использования жадного квантификатора в vim?

Гвидо
источник
2
:help greedyвзял бы вас к правильной теме справки. :help regexpсправка, описывающая вкус регулярных выражений Vim.
jamessan

Ответы:

26

В регулярном выражении Vim есть специальный синтаксис для нежадных версий операторов (это немного раздражает, но вы просто должны запомнить их): http://vimregex.com/#Non-Greedy

Нежадная версия *есть \{-}. Итак, просто замените .*на .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc
Дверная ручка
источник
6

Я предпочитаю всегда разбивать проблему на два этапа:

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

Использование очень магического «\ v», чтобы избежать многих обратных слешей, ссылки на последний поиск в подстановке и изменение разделителя подстановки. Все эти изменения делают код более читабельным.

введите описание изображения здесь

SergioAraujo
источник
2

Вы также можете использовать [^\]+/.для предотвращения жадности. [^/]означает «соответствует чему-либо ожидаемому» /и +повторяет это один или несколько раз.

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

Если у меня есть /в регулярном выражении, я буду использовать !в качестве разделителя, чтобы мне не пришлось бежать /.

пример

Предположим, у вас есть следующие 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/

Применяя замену, вы получите следующее:

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
Самир Садек
источник