regular-expression – ¿Son las magias de expresiones regulares de Vim compatibles con clases de expresiones regulares conocidas?

Pregunta:

Muchas de las sintaxis de expresiones regulares de las herramientas de Unix son a menudo las expresiones regulares básicas y extendidas codificadas en POSIX (BRE y ERE, respectivamente) y, en algunas implementaciones modernas, 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 \m es BRE y \v es ERE, excepto que POSIX no incluye modificaciones.

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

¿O tenemos que ceñirnos a la "magia" para describir las expresiones regulares de Vim?

Respuesta:

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 opción 'magic' no cambia el sabor de la expresión regular que usa Vim. Simplemente se invierte el comportamiento de muchos \ átomos -escape.

Por ejemplo, de forma predeterminada, + es un carácter + literal, donde \+ significa "uno o más de los átomos anteriores". Por el contrario, * significa "cero o más del átomo anterior", mientras que \* es un * literal. Muchas personas encuentran esto bastante confuso. Usar \v en 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 '{' aaaa literal 'a'

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

El propio sabor de expresión regular de Vim

He sido testigo de muchas personas que desean que Vim apoye a PCRE. Personalmente, me gustaría que otras herramientas respaldaran el sabor de expresiones regulares de Vim. Tiene algunas capacidades que son imposibles o demasiado engorrosas de 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 igualar. Por ejemplo, el patrón PCRE q(?!u) (o el patrón Vim regex qu\@! ) Coincide con una q que no está seguida de una u . (Esto es más correcto que q[^u] , que requiere que haya algún carácter después de q .)

Mirada atrás negativa de longitud variable

PCRE, y muchos otros sabores, tienen la restricción de que un patrón de retroceso negativo debe tener una longitud fija. Eso significa que un patrón como (?<![az]{3})foo , que significa "la cadena foo no está precedida por exactamente 3 letras minúsculas") está bien, pero (?<![az]+)foo (que significa " la cadena foo no precedida por ningún número de letras minúsculas ") no lo es.

Esta restricción no existe en Vim. En Vim, un patrón como \([az]\+\)\@<!foo , aunque quizás un poco feo de ver, es perfectamente válido.

Más fácil en Vim regex

Algunas cosas son mucho más agradables en el sabor de expresiones regulares de Vim.

Anclas de inicio y finalización del partido

Los más notables, en mi opinión, son los anclajes \zs y \ze . Estos le permiten especificar el inicio y el final del partido. Por ejemplo, foo(\zs.*\ze) solo coincide con lo que está 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\().*(?=\))

Coincidencia de prefijo

Otra cosa interesante que puede hacer Vim es hacer coincidir cualquier prefijo (incluido el prefijo vacío) de una secuencia particular de caracteres. Por ejemplo, para hacer coincidir f , fo , foo o food , se puede usar el patrón f\%[ood] . En PCRE, tal patrón se vería como 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 posiciones en el búfer.


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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım