Regex in Vi: Come si usano le classi di caratteri all'interno dei gruppi? (ad esempio [\ s \ w])


15

In Vim, la classe di caratteri \scorrisponde a qualsiasi personaggio di spazi bianchi. Quando sto usando quei caratteri speciali in gruppi, ad es [\s\w]. Non corrisponde a nessun singolo spazio bianco o carattere di parola, corrisponde so w.

Come si usano le classi di caratteri all'interno dei gruppi?


8
A differenza di alcune implementazioni dei motori delle espressioni regolari, Vim non sembra supportare tale notazione. [[:space:][:alnum:]_]può essere usato per approssimare la raccolta di \se \w, comunque.
Peter Lewerin,

@PeterLewerin Invialo come risposta.
Christopher Bottoms,

@ChristopherBottoms: fatto.
Peter Lewerin,

Risposte:


11

Non è un gruppo, è un intervallo e in Vim non puoi usare le classi di caratteri (anche se è possibile in altre implementazioni regex, ad esempio in Python ). Dovrai invece usare un'alternativa :

/\(\w\|\s\)

o:

/\v(\s|\w)

(o, la soluzione proposta da Peter Lewerin ).


2
Solo perché si può costruire un intervallo non valido in una classe di caratteri non significa che non dovrebbe essere possibile usare qualcosa come \sin una classe di caratteri. L'implementazione regex di Vim sembra aver fatto questa scelta, ma altre implementazioni ti consentono di utilizzare [\s].
Jamessan,

@VanLaser Se modifichi la risposta con queste informazioni ([\ s] è una possibilità in altre implementazioni regex ma non in vim) accetterò la tua risposta!
John HK,

(va bene, aggiunto)
VanLaser

11

A differenza di alcune implementazioni dei motori delle espressioni regolari, Vim's non sembra supportare tale notazione ( [\s\w]) nelle raccolte. Tuttavia, è possibile utilizzare espressioni di classe di caratteri POSIX .

  • [:blank:]è lo stesso di \s.
  • [:space:]corrisponde a un numero maggiore di caratteri di spazi bianchi rispetto a e \snon sembra equivalente a \_s.
  • [:alnum:]si avvicina \w, ma non corrisponde al trattino basso ( _).

Quindi la raccolta che volevi potrebbe essere scritta come [[:blank:][:alnum:]_]o [[:space:][:alnum:]_].

Non ho verificato questo testando, ma è documentato in :h regexp, :h /character-classese :h /collection.

Nota sulla portabilità: in altri motori regex, \sè in genere lo stesso di [:space:](o \_s) in Vim.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.