Expressões regulares na prática

Uma expressão regular descreve um conjunto de cadeias: \d{4}-\d{2}-\d{2} reconhece datas escritas como 2025-03-14, \d{5}-\d{3} um CEP. Os parênteses criam grupos de captura, que a substituição pode reutilizar com $1, $2 ou pelo nome, se o grupo tiver um.

As flags mudam o comportamento: g busca todas as correspondências em vez da primeira, i ignora maiúsculas e minúsculas, m faz ^ e $ valerem em cada linha, s deixa o ponto corresponder a quebras de linha, u ativa classes Unicode como \p{L}. Sem g, a substituição troca só a primeira ocorrência.

Alguns padrões, como (a+)+$ ou (\w+\s?)*$, testam um número exponencial de combinações num texto que quase corresponde e podem travar um navegador ou um servidor: é o ReDoS. Aqui o teste roda num processo separado e é interrompido depois de um segundo, então a página continua usável e avisa do problema.

Erros comuns

  • Esquecer de duplicar as barras invertidas quando a regex vai dentro de uma string no código: aqui se escreve \d, numa string JavaScript "\\d".
  • Usar .* onde é preciso .*?: o quantificador guloso pega tudo até a última ocorrência possível.
  • Aninhar quantificadores como (a+)+ ou (a|a)*: é a causa mais comum de backtracking catastrófico.

Perguntas frequentes

Qual motor de expressões regulares é usado?

O JavaScript (ECMAScript) do seu navegador. É muito parecido com o PCRE, usado pelo PHP, mas faltam algumas funções, como grupos atômicos e quantificadores possessivos.

Como uso um grupo na substituição?

Com $1, $2… para grupos numerados, $ seguido do nome entre os sinais < e > para os nomeados e $& para a correspondência inteira. Um cifrão literal se escreve $$.

O texto que digito é enviado para algum lugar?

Não: tudo acontece no navegador. Padrão e texto só vão para o endereço da página, para poder compartilhá-la, e só quando são curtos.

Como funciona este cálculo

O padrão é compilado com new RegExp(padrão, flags) e aplicado com String.prototype.matchAll, sempre com a flag g acrescentada para percorrer o texto; sem g no pedido fica só a primeira correspondência. A substituição usa String.prototype.replace com as flags escolhidas. A execução acontece num Web Worker, encerrado se não responder em 1 segundo; no máximo 1000 correspondências são listadas.