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 \m
BRE dan \v
ERE, kecuali POSIX tidak menyertakan lookarounds.
Jika korespondensi seperti itu ada, apakah itu didefinisikan di suatu tempat? pattern.txt
hanya memiliki satu penyebutan POSIX
.
Atau apakah kita harus tetap menggunakan "sihir" untuk menggambarkan ekspresi reguler Vim?
regular-expression
muru
sumber
sumber
\v
termasuk<>
batas kata, yang AFAIK unik untuk Vim. Jadi tidak, cukup gambarkan mereka sebagai "Vim regex." (Tidak memposting sebagai jawaban karena saya tidak positif)Jawaban:
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\v
dalam pola Anda membuatnya sedikit lebih konsisten.:help 'magic'
memberikan ringkasan yang baik: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 Vimqu\@!
) cocok denganq
yang tidak diikuti oleh au
. (Ini lebih benar daripadaq[^u]
, yang mengharuskan ada beberapa karakter setelahq
.)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 yangfoo
tidak diawali dengan tepat 3 huruf kecil") baik-baik saja, tetapi(?<![a-z]+)foo
(yang berarti "stringfoo
tidak 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
\zs
dan\ze
jangkar. Ini memungkinkan Anda menentukan awal dan akhir pertandingan. Misalnya,foo(\zs.*\ze)
hanya cocok dengan apa yang ada di antara(
dan)
dalam panggilan fungsifoo(...)
. 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
, ataufood
, polaf\%[ood]
dapat digunakan. Dalam PCRE, pola seperti itu akan terlihatf(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.
\%23c
kolom pertandingan 23\%<23c
cocok sebelum kolom 23\%>23c
cocok setelah kolom 23\%16l
cocok dengan baris 16\%#
cocok dengan posisi kursorSaya 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.
sumber