Guia de Expressões Regulares para desenvolvedores: do básico ao avançado
Expressões regulares (Regex ou RegExp) são sequências de caracteres que formam um padrão de busca. São uma das ferramentas mais poderosas e versáteis na caixa de ferramentas de qualquer desenvolvedor — usadas para validação de dados, parsing de texto, transformações, extração de informações e muito mais. Presentes em praticamente todas as linguagens de programação, regex é uma habilidade que vale a pena dominar.
Referência rápida de metacaracteres regex
| Padrão | Significado | Exemplo | Match |
|---|---|---|---|
| . | Qualquer caractere exceto newline | a.c | abc, aXc, a3c |
| \d | Dígito (0-9) | \d{4} | 2024, 1234 |
| \w | Letra, dígito ou _ | \w+ | hello, abc123 |
| \s | Espaço, tab, newline | \s+ | " " " \t" |
| ^ | Início da string/linha | ^Hello | Hello World (início) |
| $ | Fim da string/linha | mundo$ | Olá mundo (fim) |
| [abc] | Classe de caracteres | [aeiou] | Vogais: a, e, i, o, u |
| [^abc] | Negação de classe | [^\d] | Tudo que não é dígito |
| a* | 0 ou mais repetições | \d* | Qualquer sequência de dígitos |
| a+ | 1 ou mais repetições | \d+ | Pelo menos 1 dígito |
| a? | 0 ou 1 ocorrência | colou?r | color ou colour |
| {n,m} | Entre n e m repetições | \d{2,4} | 12, 123, 1234 |
| (abc) | Grupo de captura | (\d+)-(\d+) | 12-34 (groups: 12, 34) |
| a|b | Alternativa (OR) | cat|dog | cat ou dog |
| (?:abc) | Grupo sem captura | (?:https?):// | http:// ou https:// |
| (?=abc) | Lookahead positivo | \d+(?= anos) | "30" em "30 anos" |
Perguntas frequentes — Regex
Qual regex para validar e-mail?▼
A regex mais usada: /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/ — funciona para 99% dos casos práticos. A regex 100% correta para RFC 5322 é extremamente complexa e raramente necessária. Para validação robusta, combine regex básica + DNS lookup para verificar o domínio.
Como validar telefone brasileiro com regex?▼
Celular (com 9): /^\(?[1-9]{2}\)?\s?9[0-9]{4}-?[0-9]{4}$/ — aceita (11)99999-8888, 11999998888 etc. Fixo: /^\(?[1-9]{2}\)?\s?[2-8][0-9]{3}-?[0-9]{4}$/. Para aceitar ambos: /^\(?[1-9]{2}\)?\s?[2-9][0-9]{3,4}-?[0-9]{4}$/
Como validar CEP com regex?▼
Formato com traço: /^\d{5}-\d{3}$/ — aceita 01310-100. Sem traço: /^\d{8}$/. Para aceitar ambos: /^\d{5}-?\d{3}$/.
Qual regex para validar URL?▼
Uma regex prática (não 100% RFC): /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/=]*)$/. Para uso em produção, prefira a classe URL do JavaScript: try { new URL(str); return true; } catch { return false; }
Como substituir texto com regex em JavaScript?▼
str.replace(/padrão/g, "substituto"). Para grupos de captura: str.replace(/(\d{2})\/(\d{2})\/(\d{4})/, "$3-$2-$1") converte DD/MM/AAAA para AAAA-MM-DD. Para substituição complexa com função: str.replace(/\d+/, n => n*2) dobra cada número encontrado.
O que são flags de regex e quais são as mais importantes?▼
g (global): encontra todos os matches, não para no primeiro. i (case-insensitive): ignora maiúsculas/minúsculas. m (multiline): ^ e $ correspondem ao início/fim de cada linha. s (dotAll): o ponto corresponde também a newlines. u (unicode): suporte completo a Unicode. v (unicodeSets, ES2024): conjuntos de caracteres avançados.
Como evitar ReDoS (regex denial of service)?▼
ReDoS ocorre quando uma regex com backtracking excessivo (como /(a+)+$/) trava ao processar entradas maliciosas. Evite: grupos aninhados com quantificadores (/(a*)+/), alternativas que se sobrepõem (/(a|aa)+/). Use ferramentas como safe-regex (npm) para detectar padrões vulneráveis. Implemente timeout de execução.
Qual a diferença entre .test() e .match() em JavaScript?▼
regex.test(str) retorna boolean — mais rápido para simples verificação de existência. str.match(regex) retorna array com os matches e grupos de captura, ou null. Use .test() para validação, .match() ou .matchAll() quando precisar extrair os valores encontrados.
Como usar regex para parsear logs de servidor?▼
Defina grupos de captura para cada campo do log. Para Apache access log: /^(\S+)\s+\S+\s+(\S+)\s+\[(.+?)\]\s+"(.+?)"\s+(\d{3})\s+(\d+)/. Os grupos capturam: IP, usuário, data, requisição, status code, tamanho. Use .exec() ou .matchAll() para processar linha por linha.
Regex em banco de dados: como usar REGEXP no MySQL e PostgreSQL?▼
MySQL: WHERE coluna REGEXP "padrão" — usa POSIX ERE. PostgreSQL: WHERE coluna ~ "padrão" (case-sensitive) ou ~* "padrão" (case-insensitive). Para negação: !~ e !~*. No PostgreSQL, a função regexp_replace() e regexp_matches() oferecem funcionalidades avançadas. Note que a syntax varia entre databases.