Para saber cuándo y qué escapar sin intentos es necesario comprender con precisión la cadena de contextos por los que pasa la cadena. Especificará la cadena desde el lado más alejado hasta su destino final, que es la memoria manejada por el código de análisis regexp.
Tenga en cuenta cómo se procesa la cadena en la memoria: si puede ser una cadena simple dentro del código, o una cadena ingresada en la línea de comando, pero podría ser una línea de comando interactiva o una línea de comando dentro de un archivo de script de shell, o dentro de una variable en la memoria mencionada por el código, o un argumento (cadena) a través de una evaluación adicional, o una cadena que contiene código generado dinámicamente con cualquier tipo de encapsulación ...
Cada uno de este contexto asignó algunos caracteres con una funcionalidad especial.
Cuando desee pasar el carácter literalmente sin usar su función especial (local al contexto), entonces ese es el caso que tiene que escapar, para el siguiente contexto ... que podría necesitar algunos otros caracteres de escape que también podrían ser necesarios. escapado en los contextos anteriores. Además, puede haber cosas como la codificación de caracteres (el más insidioso es utf-8 porque parece ASCII para caracteres comunes, pero puede ser interpretado opcionalmente incluso por el terminal dependiendo de su configuración para que pueda comportarse de manera diferente, entonces el atributo de codificación de HTML / XML, es necesario comprender el proceso con precisión.
Por ejemplo, una expresión regular en la línea de comando que comienza con perl -npe
, debe transferirse a un conjunto de llamadas al sistema exec que se conectan como canalizaciones que maneja el archivo, cada una de estas llamadas al sistema exec solo tiene una lista de argumentos separados por espacios (no escapados), y posiblemente tuberías (|) y redirección (> N> N> & M), paréntesis, expansión interactiva de *
y ?
,$(())
... (todo esto son caracteres especiales usados por * sh que pueden parecer que interfieren con el carácter de la expresión regular en el siguiente contexto, pero se evalúan en orden: antes de la línea de comando. La línea de comando es leída por un programa como bash / sh / csh / tcsh / zsh, esencialmente dentro de comillas dobles o comillas simples, el escape es más simple, pero no es necesario citar una cadena en la línea de comando porque la mayoría del espacio tiene que estar prefijado con una barra diagonal inversa y la cita es no es necesario dejar disponible la funcionalidad de expansión para los caracteres * y?, pero esto se analiza en un contexto diferente al de la comilla. Luego, cuando se evalúa la línea de comando, la expresión regular obtenida en la memoria (no como está escrita en la línea de comando) recibe el mismo tratamiento que estaría en un archivo fuente. Para regexp hay un contexto de juego de caracteres entre corchetes [],La expresión regular perl se puede citar mediante un gran conjunto de caracteres no alfa-numéricos (por ejemplo, m // or m: / better / for / path: ...).
Tiene más detalles sobre los caracteres en otra respuesta, que son muy específicos para el contexto final de expresiones regulares. Como mencioné, mencionas que encuentras el escape regexp con intentos, probablemente porque un contexto diferente tiene un conjunto diferente de caracteres que confunde tu memoria de intentos (a menudo la barra diagonal inversa es el carácter utilizado en esos contextos diferentes para escapar de un carácter literal en lugar de su función )
escape()
" para permitir el uso de cadenas arbitrarias como partes de expresiones regulares.