Cocokkan kata yang mengandung karakter di luar a-zA-Z

15

Untuk mencocokkan kata, seseorang dapat menggunakan

\v(\w+)

Dari bantuan vim :h \w:

\ w karakter kata: [0-9A-Za-z_]

Ini berfungsi persis seperti yang dijelaskan dalam manual. Namun, saya ingin mencocokkan kata-kata yang mengandung karakter di luar a-z, misalnya prästgården . Mencocokkan ekspresi reguler \v(\w+)dengan hasil prästgården menjadi tiga pertandingan, sebagai gantinya:

prästgården
^^ ^^^ ^^^^

Bagaimana cara mencocokkan kata-kata yang mengandung karakter di luar a-z? Lokal saya diatur ke bahasa Inggris dan jika mungkin saya ingin tetap seperti itu.

Sunting: Kata-kata mungkin bukan milik satu lokal, misalnya

prästgården
treść
Marco
sumber
Kelas karakter POSIX (misalnya [[:alpha:]]\+dalam kasus ini) seharusnya melakukan apa yang Anda inginkan di sini, tetapi menurut Vim docs ( :help regex) itu tidak: "Item ini hanya berfungsi untuk karakter 8-bit." Itu kebetulan bekerja di sini dengan Vim 7.3 pada OS X 10.8, tetapi Vim 7.3 di Linux tidak berfungsi, jadi saya berasumsi ada sesuatu yang spesifik Apple tentang Vim ini yang memungkinkannya. Anda juga akan menemukan bahwa melakukannya melalui pengikatan Vim Perl juga gagal, meskipun Perl memiliki dukungan Unicode yang sangat baik. Anda mungkin perlu beralih ke skrip Perl eksternal, sehingga Anda dapat mengaktifkan dukungan Unicode penuh.
Warren Young
Omong-omong, jika Anda menggunakan Perl, Anda ingin menggunakan \p{Word}alih-alih kelas karakter POSIX. Ada banyak kasus pengecualian dalam penanganan kelas karakter POSIX Perl, yang Anda hindari ketika Anda menggunakan properti Unicode sebagai gantinya.
Warren Young

Jawaban:

9

Vim (pada versi 7.3) sangat terbatas sehubungan dengan dukungan karakter non-ASCII dalam pola. Secara khusus, \whanya cocok dengan huruf ASCII, yang kegunaannya terbatas.

Ada beberapa pola kelas karakter yang mendukung Unicode. Yang menarik bagi Anda adalah \I, yang pada umumnya cocok dengan huruf dan hanya huruf, plus _dan @. Setidaknya pada pemerasan Debian (di lokal UTF-8), ada kesalahan; misalnya ×dan ÷dicocokkan sebagai huruf, tetapi semua huruf beraksen Latin tampaknya dikenali dengan benar. \Idapat dikonfigurasi melalui isidentopsi, setidaknya untuk bagian ASCII.

Jika Anda ingin dukungan Unicode yang serius, Anda harus mengandalkan alat eksternal. Misalnya perl -C -e '/\p{L}/'untuk mencocokkan huruf UTF-8 (dengan asumsi lokal UTF-8).

Gilles 'SO- berhenti menjadi jahat'
sumber
3

Gunakan \k. Lihat iskeywordopsi.

Hans Ginzel
sumber
2

Ini juga berfungsi untuk Cyrillic

\v\k

Sedikit lebih rumit dan gagal dengan Cyrillic

\v(\c[0-9a-z_[=a=][=c=][=e=][=i=][=l=][=n=][=o=][=r=][=s=][=t=][=u=][=y=][=z=]])

Dok .

Diuji pada Vim 7.4.

pevik
sumber
Saya akan menambahkan [=l=]ke daftar yang akan mencakup ł(misalnya złoty), dll. Tapi ini sudah gagal untuk Rusia. Bagaimanapun, terima kasih sudah berbagi.
Marco