Bagaimana cara membuat pencocokan regex menjadi tidak serakah?

19

Saya mencoba menggunakan regex untuk mengganti teks dalam file (ganti url lengkap dengan hanya protokol / domain /):

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

Sayangnya .*?tidak cocok dengan string, bahkan mencoba untuk melarikan diri dari ?penjumlahan? Bagaimana seharusnya quantifier yang tidak rakus diloloskan dalam vim?

guido
sumber
2
:help greedyakan membawa Anda ke topik bantuan yang tepat. :help regexpadalah bantuan yang menggambarkan rasa regex Vim.
jamessan

Jawaban:

26

Regex Vim memiliki sintaks khusus untuk versi operator yang tidak serakah (agak menjengkelkan, tetapi Anda hanya perlu mengingatnya): http://vimregex.com/#Non-Greedy

Versi non-serakah *adalah \{-}. Jadi, cukup ganti .*dengan .\{-}:

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

Saya lebih suka selalu memecahkan masalah menjadi dua langkah:

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

Menggunakan sihir "\ v" yang sangat ajaib untuk menghindari banyak garis miring terbalik, merujuk pencarian terakhir di substitusi dan mengubah pembatas substitusi. Semua perubahan ini membuat kode lebih mudah dibaca.

masukkan deskripsi gambar di sini

SergioAraujo
sumber
2

Anda juga dapat menggunakan [^\]+/.untuk mencegah kerakusan. [^/]berarti "cocok dengan apa pun yang diharapkan /, dan +ulangi itu satu atau lebih kali ..

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

Jika saya miliki /di regex, saya akan gunakan !sebagai pemisah sehingga saya tidak perlu melarikan diri /.

Contoh

Misalkan Anda memiliki url berikut:

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/

Menerapkan substitusi, Anda akan mendapatkan itu:

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
sumber