Para saber quando e o que escapar sem tentativas é necessário entender com precisão a cadeia de contextos pela qual a cadeia passa. Você especificará a string do lado mais distante ao seu destino final, que é a memória manipulada pelo código de análise regexp.
Esteja ciente de como a cadeia de caracteres na memória é processada: se pode ser uma cadeia simples dentro do código ou uma cadeia inserida na linha de comando, mas a pode ser uma linha de comando interativa ou uma linha de comando declarada dentro de um arquivo de script de shell ou dentro de uma variável na memória mencionada pelo código, ou um argumento (string) por meio de avaliação adicional, ou uma string contendo código gerado dinamicamente com qualquer tipo de encapsulamento ...
Cada um desse contexto atribuiu alguns caracteres com funcionalidade especial.
Quando você deseja passar o caractere literalmente sem usar sua função especial (local para o contexto), esse é o caso em que você precisa escapá-lo, para o próximo contexto ... que pode precisar de outros caracteres de escape que adicionalmente precisam ser escapou no (s) contexto (s) anterior (es). Além disso, pode haver coisas como codificação de caracteres (o mais insidioso é utf-8, porque se parece com ASCII para caracteres comuns, mas pode ser opcionalmente interpretado mesmo pelo terminal, dependendo de suas configurações, para que possa se comportar de maneira diferente, e então pelo atributo de codificação HTML. / XML, é necessário entender o processo com precisão.
Por exemplo, uma regexp na linha de comando começando com perl -npe
, precisa ser transferido para um conjunto de chamadas do sistema exec conectando como canal que o arquivo manipula, cada uma dessas chamadas do sistema exec apenas possui uma lista de argumentos que foram separados por espaços (sem escape), e possivelmente pipes (|) e redirecionamento (> N> N> & M), parênteses, expansão interativa *
e?
,$(())
... (tudo isso são caracteres especiais usados pelo * sh que podem parecer interferir no caractere da expressão regular no próximo contexto, mas são avaliados em ordem: antes da linha de comando. A linha de comando é lida por um programa como bash / sh / csh / tcsh / zsh, essencialmente dentro de aspas duplas ou aspas simples, o escape é mais simples, mas não é necessário citar uma string na linha de comando, porque na maioria das vezes o espaço deve ser prefixado com barra invertida e as aspas são não é necessário deixar disponível a funcionalidade de expansão para os caracteres * e?, mas isso é analisado em contextos diferentes das citadas.Então, quando a linha de comando é avaliada, o regexp obtido na memória (não gravado na linha de comando) recebe o mesmo tratamento que estaria em um arquivo de origem.Para regexp, existe um contexto de conjunto de caracteres entre colchetes [],A expressão regular perl pode ser citada por um grande conjunto de caracteres não alfanuméricos (por exemplo, m // ou m: / better / for / path: ...).
Você tem mais detalhes sobre caracteres em outra resposta, que são muito específicos para o contexto final da expressão regular. Como observei, você mencionou que encontra o escape da regexp com tentativas, provavelmente porque o contexto diferente tem um conjunto de caracteres diferente que confunde sua memória de tentativas (geralmente barra invertida é o caractere usado nesse contexto diferente para escapar de um caractere literal em vez de sua função )
escape()
" para permitir o uso de seqüências arbitrárias como partes de regex.