Regex in Vi: Bagaimana cara menggunakan kelas karakter di dalam grup? (mis. [\ s \ w])

15

Di Vim, kelas karakter \scocok dengan karakter spasi apa pun. Ketika saya menggunakan karakter khusus dalam grup misalnya [\s\w]tidak cocok dengan spasi tunggal atau karakter kata, itu cocok satau w.

Bagaimana cara menggunakan kelas karakter di dalam grup?

John HK
sumber
8
Tidak seperti beberapa implementasi mesin ekspresi reguler, Vim's tampaknya tidak mendukung notasi itu. [[:space:][:alnum:]_]dapat digunakan untuk memperkirakan koleksi \sdan \w, meskipun.
Peter Lewerin
@PeterLewerin Silakan memposting itu sebagai jawaban.
Christopher Bottoms
@ChristopherBottoms: selesai.
Peter Lewerin

Jawaban:

11

Itu bukan grup, ini rentang, dan di Vim Anda tidak bisa menggunakan kelas karakter (walaupun itu mungkin di implementasi regex lainnya, misalnya dalam python ). Anda harus menggunakan alternatif sebagai gantinya:

/\(\w\|\s\)

atau:

/\v(\s|\w)

(atau, solusi yang diusulkan oleh Peter Lewerin ).

VanLaser
sumber
2
Hanya karena seseorang dapat membuat rentang yang tidak valid di kelas karakter, bukan berarti tidak mungkin menggunakan sesuatu seperti \sdi kelas karakter. Implementasi regex Vim kebetulan telah membuat pilihan itu, tetapi implementasi lain memungkinkan Anda untuk menggunakannya [\s].
jamessan
@ VanLaser Jika Anda mengedit jawaban dengan info ini ([\ s] adalah kemungkinan di implementasi-regex lain tetapi tidak dalam vim) saya akan menerima jawaban Anda!
John HK
(Baiklah, ditambahkan)
VanLaser
11

Tidak seperti beberapa implementasi mesin ekspresi reguler, Vim's tampaknya tidak mendukung notasi itu ( [\s\w]) dalam koleksi. Seseorang dapat menggunakan ekspresi kelas karakter POSIX .

  • [:blank:]sama dengan \s.
  • [:space:]cocok dengan jumlah karakter spasi yang lebih besar daripada \s, dan tampaknya setara dengan \_s.
  • [:alnum:]mendekati \w, tetapi tidak cocok dengan garis bawah ( _).

Jadi koleksi yang Anda inginkan dapat ditulis sebagai [[:blank:][:alnum:]_]atau [[:space:][:alnum:]_].

Saya belum diverifikasi ini dengan menguji, tetapi didokumentasikan dalam :h regexp, :h /character-classesdan :h /collection.

Catatan Portabilitas: Pada mesin regex lainnya, \sbiasanya sama dengan [:space:](atau \_s) di Vim.

Peter Lewerin
sumber