regular-expression – ¿Hay alguna manera de convertir un literal de expresión regular de Vim a diferentes modos mágicos?

Pregunta:

Si tengo una expresión regular Vim mágica en un literal de cadena, ¿hay alguna manera de convertir la expresión regular completa en una representación alternativa que use un modo mágico diferente, para que pueda pegar esa expresión regular equivalente en el código fuente?

Por ejemplo, si quiero convertir este patrón de modo mágico:

'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'

a very-magic-mode para hacerlo más legible, algo como:

'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'

A menudo cometo errores al intentar convertirlos a mano.

Respuesta:

El comando

:s\v\\(\W)/\1/

debería ser suficiente para transformar casi cualquier patrón en modo \v . Sin embargo, no cambiará el marcador lil ' \m , y que yo sepa, eso es imposible en un solo reemplazo. Sin embargo, es lo suficientemente corto para escribir manualmente, y luego puede hacer :s/\\m/\\v para el marcador de modo.

\W es la abreviatura de [^a-zA-Z0-9_] que es el conjunto (negado) de caracteres en el que opera el modo muy mágico. Esto simplemente elimina las barras diagonales inversas que preceden inmediatamente a uno de esos caracteres. Problema conocido: esto reemplazará \\ cadenas internas a \ . Puede reemplazar \W con \c[^a-z0-9\_] para mitigar esto, pero aun así arruinará su literal de expresión regular si lo ejecuta varias veces y también falla en cadenas de escape más largas (que contienen \\\\ por ejemplo)

Actualización: la pregunta original no deja claro si necesita transformar \v nuevo a \m , pero el comando allí es:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım