Algumas linguagens recebem a ER como um dado do tipo "string", e não simplesmente como uma ER pronta. Essa string é primeiramente interpretada pela linguagem, e só depois é passada ao robozinho. Mas o que exatamente isso quer dizer? Muitas coisas.
Primeiro, esse tratamento prévio não é algo específico das ERs, pois também acontece com qualquer string na linguagem, seja para ecoar uma mensagem na tela, seja para fazer indexação. Trechos da ER podem ser confundidos com variáveis e outras estruturas especiais, como, por exemplo, a ER $nome
poderia ser expandida para o conteúdo da variável $nome
. Mas o que geralmente pega mesmo é a interpretação de escapes, incluindo os barra-letras.
Isso nos afeta diretamente ao escrever uma ER, pois imagine que queremos casar um \t
literal, então escapamos o escape: \\t
. Mas ao receber essa string, a linguagem primeiro a interpreta, e quando vê dois escapes seguidos, o que faz? O troca por apenas um, pois \\
representa um escape literal. Com isso nosso robozinho recebe a ER \t
, que por sua vez será interpretado como um TAB literal e nossa busca falhará. Nesse caso, temos de prever o pré-processamento e escapar duplamente \\\\t
, para que o robozinho receba o \\t
que queríamos.
Felizmente, para que não precisemos ficar escapando tudo duplicado, a maioria dessas linguagens tem maneiras de se especificar uma "string crua" ("raw string"), que não é interpretada e é passada diretamente ao robozinho. Detalhes de como fazer isso estão no capítulo específico da cada linguagem, mais adiante. Mas essa característica também tem seu lado bom. Como alguns robozinhos não suportam os barra-letras, esse pré-processamento os reconhece e os converte, passando-os literais para o robô.
Concluindo, se a linguagem que você usa recebe as ERs como strings, descubra como deixá-las cruas, ou fique com dor de cabeça de tanto escapar os escapes...