Regex en Vi: ¿Cómo se usan las clases de caracteres dentro de los grupos? (por ejemplo, [\ s \ w])

15

En Vim, la clase de caracteres \scoincide con cualquier carácter de espacio en blanco. Cuando estoy usando esos caracteres especiales en grupos, por ejemplo [\s\w], no coincide con ningún espacio en blanco o carácter de palabra, sí coincide con so w.

¿Cómo se usan las clases de caracteres dentro de los grupos?

John HK
fuente
8
A diferencia de algunas implementaciones de motores de expresión regular, Vim's no parece admitir esa notación. sin embargo, [[:space:][:alnum:]_]se puede usar para aproximar la colección de \sy \w.
Peter Lewerin
@PeterLewerin Por favor, publique eso como respuesta.
Christopher Bottoms
@ChristopherBottoms: hecho.
Peter Lewerin

Respuestas:

11

Eso no es un grupo, es un rango, y en Vim no puedes usar clases de caracteres (aunque es posible en otras implementaciones de expresiones regulares, por ejemplo, en python ). Tendrás que usar una alternancia en su lugar:

/\(\w\|\s\)

o:

/\v(\s|\w)

(o la solución propuesta por Peter Lewerin ).

VanLaser
fuente
2
El hecho de que uno pueda construir un rango no válido en una clase de caracteres no significa que no debería ser posible usar algo como \sen una clase de caracteres. La implementación de expresiones regulares de Vim ha tomado esa decisión, pero otras implementaciones le permiten usar [\s].
jamessan
@VanLaser Si edita la respuesta con esta información ([\ s] es una posibilidad en otras implementaciones de expresiones regulares pero no en vim) ¡aceptaré su respuesta!
John HK
(
Muy
11

A diferencia de algunas implementaciones de motores de expresión regular, Vim's no parece admitir esa notación ( [\s\w]) en colecciones. Sin embargo, se pueden usar expresiones de clase de caracteres POSIX .

  • [:blank:]es el mismo que \s.
  • [:space:]coincide con una mayor cantidad de caracteres de espacio en blanco que \shace, y parece ser equivalente a \_s.
  • [:alnum:]aproxima \w, pero no coincide con el guión bajo ( _).

Entonces la colección que deseabas podría escribirse como [[:blank:][:alnum:]_]o [[:space:][:alnum:]_].

No he verificado esto probando, pero está documentado en :h regexp, :h /character-classes, y :h /collection.

Nota de portabilidad: en otros motores regex, \snormalmente es lo mismo que [:space:](o \_s) en Vim.

Peter Lewerin
fuente