Apakah magics regex Vim kompatibel dengan kelas regex terkenal?

16

Sintaks ekspresi reguler Banyak alat Unix sering kali adalah Basic Regular Expressified dan Ekspresi POSIX (BRE dan ERE, masing-masing), dan, dalam beberapa implementasi modern, gaya-Perl (PCRE menjadi implementasi dari ini).

Apakah ada korespondensi satu-ke-satu antara tingkat sihir Vim dan kelas yang didefinisikan secara eksternal, namun terkenal itu? Sepertinya \mBRE dan \vERE, kecuali POSIX tidak menyertakan lookarounds.

Jika korespondensi seperti itu ada, apakah itu didefinisikan di suatu tempat? pattern.txthanya memiliki satu penyebutan POSIX.

Atau apakah kita harus tetap menggunakan "sihir" untuk menggambarkan ekspresi reguler Vim?

muru
sumber
3
Cukup yakin \vtermasuk <>batas kata, yang AFAIK unik untuk Vim. Jadi tidak, cukup gambarkan mereka sebagai "Vim regex." (Tidak memposting sebagai jawaban karena saya tidak positif)
Doorknob
@ Doorknob, saya pikir Anda mungkin menemukan diskusi ini tentang jawaban-sebagai-komentar menarik. Karena komentar Anda memiliki tiga suara positif dan tidak ada komentar yang memberi tahu Anda bahwa itu salah, itu mungkin benar (saya tidak yakin), tetapi pengeditan yang disarankan et. Al. tidak mungkin untuk meningkatkan akurasinya. Sebagai jawaban yang diposting, itu dapat diedit untuk meningkatkan akurasi, terbalik, downvoted, ditanggapi, dll.
Wildcard

Jawaban:

22

Singkatnya, tidak. Regex Vim adalah rasa yang unik, dan tidak ada pilihan untuk membuatnya berperilaku lebih seperti rasa lainnya.

Saya pikir ini adalah hal yang baik.

Sihir

The 'magic'pilihan tidak mengubah rasa regex yang Vim menggunakan. Ini hanya membalikkan perilaku banyak \atom yang terhindar.

Misalnya, secara default, +adalah +karakter literal , di mana \+berarti "satu atau lebih dari atom sebelumnya". Sebaliknya, *berarti "nol atau lebih dari atom sebelumnya", sedangkan \*literal *. Banyak orang menganggap ini cukup membingungkan. Menggunakan \vdalam pola Anda membuatnya sedikit lebih konsisten. :help 'magic'memberikan ringkasan yang baik:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Secara pribadi, saya pikir perilaku default baik untuk file kode, di mana itu tidak biasa untuk mencari hal-hal seperti foo(, menggunakan literal (.

Rasa regex Vim sendiri

Saya telah menyaksikan banyak orang berharap Vim mendukung PCRE. Secara pribadi, saya berharap alat-alat lain mendukung rasa regex Vim. Ini memiliki beberapa kemampuan yang tidak mungkin atau terlalu rumit untuk dicapai di PCRE.

Tidak mungkin di PCRE

Lookaround adalah fitur umum di mana Anda dapat menyatakan bahwa suatu pola cocok atau tidak cocok sebelum atau setelah pola yang Anda coba cocokkan. Misalnya, pola PCRE q(?!u)(atau pola regim Vim qu\@!) cocok dengan qyang tidak diikuti oleh a u. (Ini lebih benar daripada q[^u], yang mengharuskan ada beberapa karakter setelah q.)

Tampilan negatif panjang variabel

PCRE, dan banyak rasa lainnya, memiliki batasan bahwa pola tampilan negatif di belakang harus memiliki panjang yang tetap. Itu berarti bahwa pola seperti (?<![a-z]{3})foo, yang berarti "string yang foo tidak diawali dengan tepat 3 huruf kecil") baik-baik saja, tetapi (?<![a-z]+)foo(yang berarti "string footidak didahului dengan sejumlah huruf kecil") tidak.

Pembatasan ini tidak ada di Vim. Dalam Vim, pola seperti \([a-z]\+\)\@<!foo, walaupun mungkin sedikit jelek untuk dilihat, sangat valid.

Lebih mudah di Vim regex

Beberapa hal jauh lebih baik dalam rasa regim Vim.

Mulai dan akhiri pertandingan jangkar

Yang paling penting, menurut saya, adalah \zsdan \zejangkar. Ini memungkinkan Anda menentukan awal dan akhir pertandingan. Misalnya, foo(\zs.*\ze)hanya cocok dengan apa yang ada di antara (dan )dalam panggilan fungsi foo(...). Ini bisa dilakukan di PCRE, tetapi membutuhkan penggunaan lookaround, yang sedikit membosankan:(?<=foo\().*(?=\))

Pencocokan awalan

Hal keren lainnya yang dapat dilakukan Vim adalah mencocokkan awalan apa pun (termasuk awalan kosong) dari urutan karakter tertentu. Misalnya, untuk mencocokkan pada f, fo, foo, atau food, pola f\%[ood]dapat digunakan. Dalam PCRE, pola seperti itu akan terlihat f(o(od?)?)?. (Bayangkan itu untuk string yang lebih panjang!)

Posisi kursor, baris, dan kolom yang cocok

Regex Vim memiliki beberapa jangkar untuk mencocokkan posisi dalam buffer.


Saya pikir itu layak - sementara untuk merangkul rasa Vim tentang regex. Ini sangat cocok untuk digunakan dalam editor teks yang digunakan terutama untuk pemrograman, dan cukup kuat.

tommcdo
sumber