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?

Zerobu
fuente
1
¿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.

Crayon violento
fuente
38

Aquí hay algunas opciones:

  • 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.

DavidO
fuente
1
¿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)";


fuente
6

Si el delimitador es /, deberá escapar.

fvox
fuente
0

Si está utilizando C #, no necesita escapar de él.

ShrapNull
fuente
Puede ser, pero aquí están usando perl.
Toto
0

Para java, no es necesario.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Si pone \ delante de /. IDE le dirá "Escape de carácter redundante" \ / "en ReGex"

Amzero
fuente