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 \m
es BRE y \v
es ERE, excepto que POSIX no incluye lookarounds.
Si existe tal correspondencia, ¿está definida en alguna parte? pattern.txt
solo tiene una mención de POSIX
.
¿O tenemos que seguir con la "magia" para describir las expresiones regulares de Vim?
regular-expression
muru
fuente
fuente
\v
incluye<>
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)Respuestas:
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\v
en su patrón lo hace un poco más consistente.:help 'magic'
da un buen resumen: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 regexqu\@!
) coincide con aq
que no está seguido por au
. (Esto es más correcto queq[^u]
, lo que requiere que haya algún carácter después delq
.)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 cadenafoo
no precedida por exactamente 3 letras minúsculas") está bien, pero(?<![a-z]+)foo
(que significa "la cadenafoo
no 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
\zs
y los\ze
anclajes. 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 comofoo(...)
. 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
, ofood
, el patrónf\%[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.
\%23c
coincide con la columna 23\%<23c
coincide antes de la columna 23\%>23c
coincide después de la columna 23\%16l
coincide con la línea 16\%#
coincide con la posición del cursorCreo 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.
fuente