Jangkar "Zoom"
Selain jawaban @ jecxjo, ada banyak situasi di mana Anda dapat menggunakan jangkar nol-lebar \zs
dan \ze
bukannya mencari-cari yang positif. Jangkar-jangkar ini menentukan awal ( \zs
) dan akhir ( \ze
) dari pertandingan dalam pola penuh.
Contohnya
foo\zsbar
akan cocok bar
didahului oleh foo
( foo
bukan bagian dari pertandingan)
foo\zebar
akan cocok foo
diikuti oleh bar
( bar
bukan bagian dari pertandingan)
myFunction(\zs.*\ze)
akan cocok dengan parameter dalam panggilan fungsi (untuk tujuan demonstrasi, saya tidak fokus pada pencocokan serakah vs tidak serakah)
Menggunakannya
Ini menjadi sangat berguna saat menggunakan :substitute
perintah. Misalnya, saya ingin mengganti parameter dalam pemanggilan fungsi myFunction()
dengan foo
:
:%s/myFunction(\zs.*\ze)/foo/
Ini akan pergi myFunction(
dan )
utuh, dan Anda tidak perlu khawatir tentang menangkap mereka dalam pola Anda atau mengulanginya di pengganti Anda .
Anda bisa melakukan ini menggunakan fitur lookaround dari regex Vim, tetapi cukup kikuk:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Saya menemukan sintaksis ini menyebabkan saya melupakan apa yang saya coba lakukan sejak awal.)
Anda masih perlu mencari-cari kadang-kadang
Masih ada situasi di mana Anda perlu mencari. Menggunakan \zs
dan \ze
bagus untuk situasi sederhana di mana Anda memiliki sesuatu sebelum diikuti oleh teks untuk mencocokkan diikuti oleh sesuatu setelah . Tetapi jika itu lebih kompleks dari itu, Anda mungkin harus tetap menggunakan sintaks lookaround yang lebih berat.
Fakta yang menyenangkan
Meskipun mereka jauh lebih jelek, lookaround Vim lebih kuat daripada yang ada di PCRE! Mereka mendukung tampilan negatif panjang variabel, yang berarti Anda dapat menegaskan bahwa beberapa pola yang panjangnya tidak ditentukan tidak sebelum pertandingan Anda.
PCRE tidak mendukung ini, karena ini cukup mahal secara komputasi. Itu bukan masalah besar di Vim, karena kasus penggunaan paling umum dari regex cenderung melibatkan pencarian interaktif di mana waktu perhitungannya hampir tak terlihat oleh pengguna. Anda mungkin akan memperhatikannya jika digunakan untuk penyorotan sintaks.
Topik Bantuan yang Relevan
:help \zs
:help \ze
:help perl-patterns
Sepertinya ini mungkin. Ada tabel sederhana untuk beralih dari perl ke vim.
:h perl-patterns
Jadi misalnya jika Anda memiliki string
one two three
dan Anda ingin mencocokkanone
hanya jika<space>two
mengikutinya Anda dapat menggunakanIni mirip dengan versi perl
sumber