¿Las magias de expresiones regulares de Vim son compatibles con las clases de expresiones regulares conocidas?


16

Las sintaxis de expresión regular de muchas herramientas de Unix son a menudo las expresiones regulares básicas y extendidas codificadas por POSIX (BRE y ERE, respectivamente) y, en algunas implementaciones modernas, el estilo Perl (PCRE es una implementación de esto).

¿Existe una correspondencia uno a uno entre los niveles de magia de Vim y esas clases definidas externamente, pero bien conocidas? Parece que \mes BRE y \ves ERE, excepto que POSIX no incluye lookarounds.

Si existe tal correspondencia, ¿está definida en alguna parte? pattern.txtsolo tiene una mención de POSIX.

¿O tenemos que seguir con la "magia" para describir las expresiones regulares de Vim?


3
Bastante seguro \vincluye <>límites de palabras, que AFAIK es exclusivo de Vim. Entonces no, solo descríbelos como "Vim regex". (No publico como respuesta porque no soy positivo)
Pomo

@Doorknob, creo que puede encontrar esta discusión de respuestas como comentarios interesante. Dado que su comentario tiene tres votos a favor y no hay comentarios que respondan para decirle que es incorrecto, probablemente sea correcto (no estoy seguro), pero sugirió ediciones et. Alabama. Son imposibles de mejorar su precisión. Como respuesta publicada, podría editarse para mejorar la precisión, votar, votar, responder, etc.
Comodín el

Respuestas:


22

En resumen, no. La expresión regular de Vim es un sabor único, y no hay opciones para que se comporte más como otro sabor.

Pienso que es una cosa buena.

magia

La 'magic'opción no cambia el sabor de la expresión regular que usa Vim. Simplemente invierte el comportamiento de muchos \átomos escapados.

Por ejemplo, por defecto, +es un +carácter literal , donde \+significa "uno o más del átomo anterior". En contraste, *significa "cero o más del átomo precedente", mientras que \*es un literal *. Muchas personas encuentran esto bastante confuso. El uso \ven su patrón lo hace un poco más consistente. :help 'magic'da un buen resumen:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Personalmente, creo que el comportamiento predeterminado es bueno para los archivos de código, donde no es raro buscar cosas como foo(, usando el literal (.

Propio sabor regex de Vim

He sido testigo de muchas personas que desean que Vim sea compatible con PCRE. Personalmente, deseo que otras herramientas admitan el sabor de expresión regular de Vim. Tiene algunas capacidades que son imposibles o demasiado engorrosas para lograr en PCRE.

Imposible en PCRE

Lookaround es una característica común en la que puede afirmar que un patrón coincide o no antes o después del patrón que está tratando de hacer coincidir. Por ejemplo, el patrón PCRE q(?!u)(o patrón Vge regex qu\@!) coincide con a qque no está seguido por a u. (Esto es más correcto que q[^u], lo que requiere que haya algún carácter después del q.)

Retroceso negativo de longitud variable

PCRE, y muchos otros sabores, tienen la restricción de que un patrón de mirar hacia atrás negativo debe ser de una longitud fija. Eso significa que un patrón como (?<![a-z]{3})foo, que significa "la cadena foo no precedida por exactamente 3 letras minúsculas") está bien, pero (?<![a-z]+)foo(que significa "la cadena foono precedida por ninguna cantidad de letras minúsculas") no lo está.

Esta restricción no existe en Vim. En Vim, un patrón como \([a-z]\+\)\@<!foo, aunque tal vez un poco feo a la vista, es perfectamente válido.

Más fácil en Vim regex

Algunas cosas son mucho más agradables en el sabor de la expresión regular de Vim.

Anclas de inicio y fin del partido

Los más notables, en mi opinión, son los \zsy los \zeanclajes. Estos te permiten especificar el inicio y el final del partido. Por ejemplo, foo(\zs.*\ze)coincide solo con lo que hay entre (y )en una llamada de función como foo(...). Esto se puede hacer en PCRE, pero requiere el uso de lookaround, que es un poco tedioso:(?<=foo\().*(?=\))

Prefijo coincidente

Otra cosa genial que Vim puede hacer es unir cualquier prefijo (incluido el prefijo vacío) de una secuencia particular de caracteres. Por ejemplo, para que coincida en f, fo, foo, o food, el patrón f\%[ood]se puede utilizar. En PCRE, tal patrón se vería así f(o(od?)?)?. (¡Imagínese eso para una cuerda más larga!)

Coincidencia de posiciones de cursor, línea y columna

La expresión regular de Vim tiene algunos anclajes para hacer coincidir las posiciones en el búfer.


Creo que vale la pena abrazar el sabor de la expresión regular de Vim. Es muy adecuado para su uso en un editor de texto utilizado principalmente para la programación, y es bastante potente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.