Escapar de una barra inclinada en una expresión regular
106
Mi pregunta es simple y se trata del escape de expresiones regulares. ¿Tiene que escapar de una barra inclinada /en una expresión regular? ¿Y cómo lo harías?
¿Qué implementación de lenguaje / expresión regular usas?
Gumbo
Curiosamente, estaba buscando esta pregunta para Javascript. Pero luego mi IDE dijo que estaba usando un escape innecesario. Entonces myStr.replace(/[/:.-]+/gi, '_')es válido para mi sorpresa. Pensé que lo iba a necesitar /[\/:.-]+/gi. No puedo decidir si esto es genial o confuso.
Turbo
Respuestas:
90
¿Qué contexto / idioma? Algunos lenguajes lo utilizan /como delimitador de patrones, así que sí, debe escapar de él, según el idioma / contexto. Puede escapar colocando una barra inclinada hacia atrás delante de él: \/para algunos lenguajes (como PHP) puede usar otros caracteres como delimitador y, por lo tanto, no necesita escapar. Pero AFAIK en todos los idiomas, el único significado especial que /tiene es que puede ser el delimitador de patrón designado.
En Perl, puede elegir delimitadores alternativos. No estás limitado a m//. Puedes elegir otro, como m{}. Entonces escapar no es necesario. De hecho, Damian Conway en "Perl Best Practices" afirma que m{}es el único delimitador alternativo que debería usarse, y esto es reforzado por Perl :: Critic (en CPAN). Mientras que usted puede conseguir lejos con el uso de una variedad de caracteres delimitadores alternativos, //y {}parece ser la más clara de descifrar más adelante. Sin embargo, si cualquiera de esas opciones da como resultado un escape excesivo, elija la que se preste mejor a la legibilidad. Los ejemplos más comunes son m(...), m[...]y m!...!.
En los casos en los que no pueda o prefiera no usar delimitadores alternativos, puede escapar de las barras diagonales con una barra invertida: m/\/[^/]+$/por ejemplo (usando un delimitador alternativo que podría convertirse en m{/[^/]+$}, que puede leer con más claridad). Escapar de la barra con una barra invertida es lo suficientemente común como para haberse ganado un nombre y una página de wikipedia: Síndrome del palillo de dientes inclinado . En las expresiones regulares en las que solo hay una instancia, escapar de una barra inclinada podría no llegar al nivel de ser considerado un obstáculo para la legibilidad, pero si comienza a salirse de control y su lenguaje permite delimitadores alternativos como lo hace Perl, eso sería ser la solución preferida.
¿Puede dar un ejemplo? Tengo esto: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confy tengo conflictos con las barras diagonales.
CMCDragonkai
Tenga en cuenta que usa un s, no un m, cuando hace un reemplazo (también conocido como sustituto) con expresiones regulares. perlfect.com/articles/regex.shtml
Mashmagar
2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... pero esto probablemente sea mejor: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confporque evita la interpolación de shell.
DavidO
1
Una alternativa para escapar del /carácter literal es usar la funcionalidad regex de especificar un carácter por su codificación ASCII, en hexadecimal u octal. Perl acepta la forma octal \57(fuente regular-expressions.info/refcharacters.html )
lukeuser
En la página vinculada por lukeuser (gracias) también está la secuencia de escape \ Q ... \ E. Esto funcionó para mí.
user3012857
11
Use la barra invertida \o elija un delimitador diferente, es decir, en m#.\d#lugar de /.\d/
"En Perl, puede cambiar el delimitador de expresión regular / a casi cualquier otro carácter especial si lo precede con la letra m (para coincidencia)";
myStr.replace(/[/:.-]+/gi, '_')
es válido para mi sorpresa. Pensé que lo iba a necesitar/[\/:.-]+/gi
. No puedo decidir si esto es genial o confuso.Respuestas:
¿Qué contexto / idioma? Algunos lenguajes lo utilizan
/
como delimitador de patrones, así que sí, debe escapar de él, según el idioma / contexto. Puede escapar colocando una barra inclinada hacia atrás delante de él:\/
para algunos lenguajes (como PHP) puede usar otros caracteres como delimitador y, por lo tanto, no necesita escapar. Pero AFAIK en todos los idiomas, el único significado especial que/
tiene es que puede ser el delimitador de patrón designado.fuente
Aquí hay algunas opciones:
En Perl, puede elegir delimitadores alternativos. No estás limitado a
m//
. Puedes elegir otro, comom{}
. Entonces escapar no es necesario. De hecho, Damian Conway en "Perl Best Practices" afirma quem{}
es el único delimitador alternativo que debería usarse, y esto es reforzado por Perl :: Critic (en CPAN). Mientras que usted puede conseguir lejos con el uso de una variedad de caracteres delimitadores alternativos,//
y{}
parece ser la más clara de descifrar más adelante. Sin embargo, si cualquiera de esas opciones da como resultado un escape excesivo, elija la que se preste mejor a la legibilidad. Los ejemplos más comunes sonm(...)
,m[...]
ym!...!
.En los casos en los que no pueda o prefiera no usar delimitadores alternativos, puede escapar de las barras diagonales con una barra invertida:
m/\/[^/]+$/
por ejemplo (usando un delimitador alternativo que podría convertirse enm{/[^/]+$}
, que puede leer con más claridad). Escapar de la barra con una barra invertida es lo suficientemente común como para haberse ganado un nombre y una página de wikipedia: Síndrome del palillo de dientes inclinado . En las expresiones regulares en las que solo hay una instancia, escapar de una barra inclinada podría no llegar al nivel de ser considerado un obstáculo para la legibilidad, pero si comienza a salirse de control y su lenguaje permite delimitadores alternativos como lo hace Perl, eso sería ser la solución preferida.fuente
perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf
y tengo conflictos con las barras diagonales.s
, no unm
, cuando hace un reemplazo (también conocido como sustituto) con expresiones regulares. perlfect.com/articles/regex.shtmlperl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf
... pero esto probablemente sea mejor:perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.conf
porque evita la interpolación de shell./
carácter literal es usar la funcionalidad regex de especificar un carácter por su codificación ASCII, en hexadecimal u octal. Perl acepta la forma octal\57
(fuente regular-expressions.info/refcharacters.html )Use la barra invertida
\
o elija un delimitador diferente, es decir, enm#.\d#
lugar de/.\d/
"En Perl, puede cambiar el delimitador de expresión regular / a casi cualquier otro carácter especial si lo precede con la letra m (para coincidencia)";fuente
Si el delimitador es /, deberá escapar.
fuente
Si está utilizando C #, no necesita escapar de él.
fuente
Para java, no es necesario.
Si pone \ delante de /. IDE le dirá "Escape de carácter redundante" \ / "en ReGex"
fuente