Як зробити матриці з регулярними виразками не жадібними?


20

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

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

На жаль .*?, не відповідає рядку, навіть намагаючись уникнути ?кількісного показника? Як слід уникати не жадібний квантор у vim?


2
:help greedyпереніс би вас до потрібної теми допомоги. :help regexp- це допомога, що описує аромат регексу Vim.
Jamessan

Відповіді:


27

Регекс Vim має спеціальний синтаксис для не жадібних версій операторів (це щось дратує, але вам просто потрібно запам'ятати їх): http://vimregex.com/#Non-Greedy

Нежадібні версія *є \{-}. Отже, просто замініть .*на .\{-}:

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

6

Я вважаю за краще завжди розбивати проблему на два етапи:

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

Використовуючи дуже магічне "\ v", щоб уникнути багатьох зворотних косих ринків, посилаючись на останній пошук заміни та зміну роздільника заміни. Всі ці зміни роблять код читабельнішим.

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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.