Jika saya memiliki regex Vim ajaib dalam string literal, apakah ada cara untuk mengubah regex keseluruhan menjadi representasi alternatif yang menggunakan mode sulap yang berbeda, jadi saya bisa menempelkan regex yang setara ke dalam kode sumber?
Misalnya, jika saya ingin mengubah pola mode-ajaib ini:
'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'
ke mode yang sangat ajaib untuk membuatnya lebih mudah dibaca, seperti:
'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'
Saya sering membuat kesalahan dengan mencoba mengubahnya dengan tangan.
regular-expression
Mu Mind
sumber
sumber
[0-9]+
menjadi yang tidak ajaib ... ;-)Jawaban:
Perintah
harus cukup untuk mengubah sebagian besar pola menjadi
\v
mode. Itu tidak akan menukar\m
penanda lil ' - dan setahu saya itu tidak mungkin dalam satu penggantian. Cukup pendek untuk mengetik secara manual, dan kemudian Anda bisa melakukannya:s/\\m/\\v
untuk penanda mode.\W
adalah singkatan[^a-zA-Z0-9_]
yang merupakan set (dinegasikan) karakter yang beroperasi dengan mode sangat ajaib. Ini hanya menghapus garis miring terbalik segera sebelum salah satu karakter tersebut. Masalah yang diketahui: Ini akan menggantikan\\
string di dalam menjadi\
. Anda bisa mengganti\W
dengan\c[^a-z0-9\_]
untuk mengurangi ini, tetapi masih akan mengacaukan regex literal Anda jika Anda menjalankannya berkali-kali dan juga gagal pada string escape yang lebih lama (mengandung\\\\
misalnya)Pembaruan: Pertanyaan awal membuatnya tidak jelas apakah Anda perlu mengubahnya
\v
kembali\m
, tetapi perintahnya ada:sumber