Regex in Vi: Comment utilise-t-on les classes de caractères dans les groupes? (par exemple [\ s \ w])

15

Dans Vim, la classe de caractères \scorrespond à n'importe quel caractère d'espacement. Lorsque j'utilise ces caractères spéciaux dans des groupes, par exemple, [\s\w]il ne correspond à aucun espace blanc ou caractère de mot, il correspond à sou w.

Comment utilise-t-on les classes de caractères à l'intérieur des groupes?

John HK
la source
8
Contrairement à certaines implémentations de moteurs d'expression régulière, Vim ne semble pas prendre en charge cette notation. [[:space:][:alnum:]_]peut être utilisé pour approximer la collection de \set \w, cependant.
Peter Lewerin
@PeterLewerin Veuillez poster cela comme réponse.
Christopher Bottoms du
@ChristopherBottoms: terminé.
Peter Lewerin

Réponses:

11

Ce n'est pas un groupe, c'est une plage et dans Vim, vous ne pouvez pas utiliser de classes de caractères (bien que cela soit possible dans d'autres implémentations regex, par exemple en python ). Vous devrez utiliser une alternance à la place:

/\(\w\|\s\)

ou:

/\v(\s|\w)

(ou, la solution proposée par Peter Lewerin ).

VanLaser
la source
2
Ce n'est pas parce qu'on peut construire une plage non valide dans une classe de caractères qu'il ne devrait pas être possible d'utiliser quelque chose comme \sdans une classe de caractères. L'implémentation d'expression régulière de Vim a fait ce choix, mais d'autres implémentations vous permettent d'utiliser [\s].
jamessan
@VanLaser Si vous modifiez la réponse avec cette information ([\ s] est une possibilité dans d'autres implémentations regex mais pas dans vim) j'accepterai votre réponse!
John HK
(très bien, ajouté)
VanLaser
11

Contrairement à certaines implémentations de moteurs d'expression régulière, Vim ne semble pas prendre en charge cette notation ( [\s\w]) dans les collections. On peut cependant utiliser des expressions de classe de caractères POSIX .

  • [:blank:]est le même que \s.
  • [:space:]correspond à un plus grand nombre de caractères d'espaces que le \sfait, et semble être équivalent à \_s.
  • [:alnum:]se rapproche \w, mais ne correspond pas au trait de soulignement ( _).

Ainsi, la collection que vous vouliez pourrait être écrite comme [[:blank:][:alnum:]_]ou [[:space:][:alnum:]_].

Je ne l' ai pas vérifié en testant, mais il est documenté dans :h regexp, :h /character-classeset :h /collection.

Remarque sur la portabilité: dans les autres moteurs d'expression régulière, \sest généralement le même que [:space:](ou \_s) dans Vim.

Peter Lewerin
la source