Normal ifade eşleştiricileri nasıl açgözlü hale getirilir?


22

Bir dosyadaki metni değiştirmek için bir normal ifade kullanmaya çalışıyorum (tam bir url yerine sadece protokol / etki alanı /):

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

Ne yazık ki .*?, ?nicelleştiriciden kaçmaya çalışırken dizeyle eşleşmiyor mu? Açgözlü olmayan niceleyici vim'den nasıl kaçınmalı?


3
:help greedysizi doğru yardım konusuna götürürdü. :help regexpVim'in normal ifade lezzetini tarif eden yardımcıdır.
jamessan

Yanıtlar:


30

Vim'in normal ifadesinin operatörlerin açgözlü olmayan sürümleri için özel bir sözdizimi vardır (bu biraz can sıkıcıdır, ancak onları ezberlemeniz gerekir): http://vimregex.com/#Non-Greedy

Olmayan açgözlü versiyonu *olduğunu \{-}. Yani, basitçe yerine .*sahip .\{-}:

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

9

Sorunu her zaman iki aşamaya bölmeyi tercih ederim:

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

Birçok ters eğik çizgiden kaçınmak için çok sihirli "\ v" kullanmak, ikamedaki son aramaya referans vermek ve ikame sınırlayıcısını değiştirmek. Tüm bu değişiklikler kodu daha okunabilir hale getirir.

resim açıklamasını buraya girin


2

[^\]+/.Açgözlülüğü önlemek için de kullanabilirsiniz . [^/]"beklediğiniz her şeyi eşleştirin /ve +bunu bir veya daha fazla kez tekrarlayın " anlamına gelir .

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

Ben varsa /regex, ben kullanacak !kaçmak zorunda kalmamak için ayırıcı olarak /.

Misal

Aşağıdaki URL'lere sahip olduğunuzu varsayalım:

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/

İkame uygulandığında şunu elde edersiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.