Ramos da InformáticaRegex e Expressões Regulares: Guia Definitivo

Regex e Expressões Regulares: Guia Definitivo

-

Ramos da Informática
JS TS IA

Pesquisa: Como você está usando IA na sua rotina Dev?

Responda em menos de 2 minutos e ajude a direcionar nossos próximos artigos técnicos, guias e conteúdos.

Responder Pesquisa →

Expressão regular – ou simplesmente REGEX – é uma sequência de caracteres que define um padrão de busca, é geralmente utilizada dentro de algoritmos de pesquisa de texto para busca e/ou substituição de sequências/padrões de caracteres dentro de strings. Por sua praticidade, está implementada dentro de linguagens de programação, ferramentas e até mesmo alguns aplicativos.

Neste artigo vamos explorar as expressões regulares (regex) mais comuns na programação e no uso de instruções SQL. Ao final, uma lista de feramentas online onde o desenvolvedor pode testar as expressões regulares de acordo com a linguagem de programação que esteja utilizando.

Mas antes conheça nossa ferramenta BR de Regex e com mais de 150 regex brasileiros. 

Expressão regular para validar um campo que aceita CPF ou CNPJ (sem cálculo dos dígitos verificadores):

/^([0-9]{3}.?[0-9]{3}.?[0-9]{3}-?[0-9]{2}|[0-9]{2}.?[0-9]{3}.?[0-9]{3}/?[0-9]{4}-?[0-9]{2})$/

Ela pode ser entendida assim (onde “cpf” é a expressão para validar CPF e “cnpj” é a expressão para validar CNPJ):

Dica de Leitura: Se você está explorando expressões regulares e melhorias na programação, pode estar interessado em como ferramentas avançadas podem auxiliar no desenvolvimento. Confira nosso artigo sobre Guia para usar o OpenAI Codex com mais eficiência para descobrir como automatizar e aprimorar suas tarefas de codificação.

/^(cpf|cnpj)$/

As barras inicial e final (/) não fazem parte da expressão propriamente dita – são apenas delimitadores. O caracter ^ no começo e o caracter $ no final exigem que o conteúdo completo do string a ser validado corresponda à expressão entre os mesmos. Os parênteses contendo a barra vertical (a|b) criam uma “opção” alternativa entre “a” e “b“. Satisfazendo qualquer uma das duas expressões, o resultado será positivo. No lugar de “a” e “b“, temos então as expressões específicas para CPF e CNPJ, separadamente.

Para CPF:

[0-9]{3}.?[0-9]{3}.?[0-9]{3}-?[0-9]{2}

A interrogação (?) faz com que a especificação de caractere precedente seja opcional. Portanto os pontos e o tracinho são opcionais. A classe de caracteres [0-9] representa qualquer caracter de 0 a 9 (poderíamos usar d, mas eu prefiro [0-9] por ser mais legível). Finalmente, o número entre colchetes ({3}) determina uma quantidade específica de vezes que a especificação de caractere precedente deve se repetir. Assim sendo, são requeridos no total 11 caracteres numéricos (3 + 3 + 3 + 2).

Para CNPJ, a estrutura é semelhante:

[0-9]{2}.?[0-9]{3}.?[0-9]{3}/?[0-9]{4}-?[0-9]{2}

Aqui são requeridos no total 14 caracteres numéricos (2 + 3 + 3 + 4 + 2).

Lembrando que a barra invertida () antes do ponto (.) e outros caracteres especiais é um caracter de “escape”, que serve para desconsiderar a interpretação especial do caractere seguinte e considerá-lo literalmente. (O ponto, sem “escape”, significa “qualquer caractere”. Com “escape”, significa meramente o caractere “ponto” mesmo.).

LEIA TAMBÉM: 21 comandos SQL essenciais para programadores e BI

Regex para RG

Valida qualquer RG, incluíndo finais com o dígito X

(^d{1,2}).?(d{3}).?(d{3})-?(d{1}|X|x$)

Regex para validar e-mail

Primeiramente você precisa aceitar que não será capaz de processar todos os e-mails possíveis. A especificação deles é longa e complicada. Por exemplo, aqui está uma regex que aceita todos os emails e nada mais: http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

Tendo isso em mente, parte-se para fazer uma regex que possa acertar na maioria dos casos.

/^[a-z0-9.]+@[a-z0-9]+.[a-z]+.([a-z]+)?$/i

(regexplained)

Seu erro aqui foi apenas o de não incluir o último . dentro dos parênteses. Fazendo isso tenho esse resultado:

[email protected]       true
[email protected]    true
[email protected] false
foo.bar@gmail.          false
foo.bar@gmailcom        false
foo.bargmail.com        false
@gmail.com                 false

É uma boa alternativo. Mas isso vai falhar em diversos outros casos. Como se o email incluir underlines ou +, ou se o dominio incluir muitos caracteres (como alguns do governo [email protected], ).

Uma sugestão mais completa, vinda da especificação do HTML5 pela W3C:

The following JavaScript- and Perl-compatible regular expression is an implementation of the above definition.

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

(regexplained)

É importante sempre existir uma validação feita pelo servidor, geralmente enviando um e-mail de confirmação. Usualmente a validação no cliente é usada apenas para melhorar a experiencia de usuário, mostrando o que está errado sem a demora de esperar uma resposta do servidor.

Regex para cartões de crédito

Amex: ^3[47][0-9]{13}$
Aura: /^((?!504175))^((?!5067))(^50[0-9])/
Banese Card: ‘^636117’
Cabal: ‘(60420[1-9]|6042[1-9][0-9]|6043[0-9]{2}|604400)’
Diners: ‘(36[0-8][0-9]{3}|369[0-8][0-9]{2}|3699[0-8][0-9]|36999[0-9])
Discover: /^6(?:011|5[0-9]{2})[0-9]{12}/
Elo: /^4011(78|79)|^43(1274|8935)|^45(1416|7393|763(1|2))|^50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|^627780|^63(6297|6368|6369)|^65(0(0(3([1-3]|[5-9])|4([0-9])|5[0-1])|4(0[5-9]|[1-3][0-9]|8[5-9]|9[0-9])|5([0-2][0-9]|3[0-8]|4[1-9]|[5-8][0-9]|9[0-8])|7(0[0-9]|1[0-8]|2[0-7])|9(0[1-9]|[1-6][0-9]|7[0-8]))|16(5[2-9]|[6-7][0-9])|50(0[0-9]|1[0-9]|2[1-9]|[3-4][0-9]|5[0-8]))/
Fort Brasil: ‘^628167’
GrandCard: ‘^605032’
Hipercard: ^606282|^3841(?:[0|4|6]{1})0
JCB: /^(?:2131|1800|35d{3})d{11}/
Mastercard: ^((5(([1-2]|[4-5])[0-9]{8}|0((1|6)([0-9]{7}))|3(0(4((0|[2-9])[0-9]{5})|([0-3]|[5-9])[0-9]{6})|[1-9][0-9]{7})))|((508116)\d{4,10})|((502121)\d{4,10})|((589916)\d{4,10})|(2[0-9]{15})|(67[0-9]{14})|(506387)\d{4,10})
Personal Card: ‘^636085’
Sorocred: ‘^627892|^636414’
Valecard: ‘^606444|^606458|^606482’

Visa: ^4[0-9]{15}$

Outras formatações de Regex

Codigo Cor HTML ^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$ #00ccff
Arquivo de Imagem ^[a-zA-Z0-9-_.]+.(jpg|gif|png)$ new-pic_company.jpg
Endereco IP ^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2}).){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$ 192.168.0.1
Arquivos Multimedia ^[a-zA-Z0-9-_.]+.(swf|mov|wma|mpg|mp3|wav)$ company-presentation.swf
Data Formato Mysql ^d{4}-(0[1-9]|1[0,1,2])-(0[1-9]|[1,2][0-9]|3[0,1])$ 2012-09-02
Telefone (BR) ^(?d{2})?[s-]?d{4}-?d{4}$ (11) 5555-1977
Codigo Postal (EUA) ^([A-Z][0-9]){3}$ V2B2S3
Hora (HH:MM) ^([0-1][0-9]|[2][0-3])(:([0-5][0-9])){1,2}$ 12:29
URL ^(http[s]?://|ftp://)?(www.)?[a-zA-Z0-9-.]+.(com|org|net|mil|edu|ca|co.uk|com.au|gov|br)$ http://www.google.com
Telefone Internacional ^(([0-9]{1})*[- .(]*([0-9a-zA-Z]{3})*[- .)]*[0-9a-zA-Z]{3}[- .]*[0-9a-zA-Z]{4})+$ 1.245.532.3422
CEP Brasileiro /^[0-9]{5}-[0-9]{3}$/ 33.300-070
Curso Banco de Dados

 

english-interview-debugger.sh
$ grep -r "senior_dev_communication" ./career
[CRITICAL_ERROR] Código sênior detectado, mas fluência falhou no runtime.
Motivo: Travou na hora de explicar a arquitetura (System Design) em inglês para o gringo.

O mercado internacional não quer um robô de gramática. Quer um dev que saiba defender uma tomada de decisão técnica sob pressão. Destrave sua conversão na Preply com aulas particulares focadas em TI.

$ ./fix-english.sh --target=remote-job
Achar Professor Particular ➔

Expressões regulares em bancos de dados SQL

É bastante utilizado regex em queries SQL no banco de dados.

O operador LIKE até quebra um galho para pesquisas mais simples, com seus metacaracteres % e _. Mas para ir além e fazer pesquisas realmente complexas, é preciso de uma gama de metacaracteres das expressões regulares.

As expressões não fazem parte do padrão SQL, mas alguns bancos de dados já se adiantaram e passaram a suportá-las. Porém, pela falta do padrão, cada banco implementou de seu próprio jeito, o que gerou uma diferença na sintaxe de uso. Nos exemplos seguintes, serão mostradas as sintaxes dos principais bancos.

Suponha que temos um banco de dados com uma tabela chamada veiculos, que traz vários dados sobre cada veículo. A placa do veículo, por exemplo, deve estar no formato AAA-9999. Este é um formato simples, que conseguimos representar com a expressão regular ^[A-Z]{3}-d{4}$. Para listar todos os veículos cujas placas estão no formato correto:

-- Listar os veículos cujas placas estão no formato AAA-9999

-- MySQL, MariaDB, SQLite
SELECT * FROM veiculos WHERE placa REGEXP '^[A-Z]{3}-d{4}$';

-- PostgreSQL
SELECT * FROM veiculos WHERE placa ~ '^[A-Z]{3}-d{4}$';

-- Oracle
SELECT * FROM veiculos WHERE REGEXP_LIKE(placa, '^[A-Z]{3}-d{4}$');

As coisas ainda estão um pouco bagunçadas, não? Enquanto o SQLite e o MySQL usam o operador REGEXP, o PostgreSQL usa o operador ~ e o Oracle usa uma função REGEXP_LIKE(). Mas tudo bem, use essa colinha para lembrar.

Para fazer uma expressão negada, basta colocar NOT antes do operador, ou no caso do PostgreSQL, usar !~. Voltando ao exemplo anterior, agora buscando os veículos cujas placas não seguem o padrão:

-- Listar os veículos cujas placas NÃO estão no formato AAA-9999

-- MySQL, MariaDB, SQLite
SELECT * FROM veiculos WHERE placa NOT REGEXP '^[A-Z]{3}-d{4}$';

-- PostgreSQL
SELECT * FROM veiculos WHERE placa !~ '^[A-Z]{3}-d{4}$';

-- Oracle
SELECT * FROM veiculos WHERE NOT REGEXP_LIKE(placa, '^[A-Z]{3}-d{4}$');

E que tal se eu te contar que além de pesquisas, você também pode fazer alterações usando expressões regulares? Aí sim, o negócio começa a ficar muito interessante!

O exemplo anterior listou todas as placas que estão fora do padrão AAA-9999. Lembre-se, o usuário é “criativo” na hora de digitar dados, então é comum encontrarmos placas em formatos variados, como AAA 9999, AAA.9999, AAA:9999, AAA9999, …

Em geral, é a aplicação quem faz a limpeza destes dados na hora de mostrá-los na tela, removendo os caracteres indesejados e formatando no padrão correto. Mas você já pode fazer isso na própria consulta SQL, usando substituição de texto com expressões regulares:

-- Mostra o valor original e o formatado como AAA-9999

-- MariaDB
SELECT
  placa AS placa_original,
  REGEXP_REPLACE(placa, '^([A-Z]{3})[.: ]?(d{4})$', '\1-\2') AS placa_ok
FROM veiculos;

-- PostgreSQL
SELECT
  placa AS placa_original,
  regexp_replace(placa, '^([A-Z]{3})[.: ]?(d{4})$', '\1-\2') AS placa_ok
FROM veiculos;

-- Oracle
SELECT
  placa AS placa_original,
  REGEXP_REPLACE(placa, '^([A-Z]{3})[.: ]?(d{4})$', '1-2') AS placa_ok
FROM veiculos;

Que tal ir um passo além, e já corrigir estes dados diretamente no banco de uma vez? Assim, eles já estarão sempre corretos e ninguém mais precisará se preocupar em formatá-los posteriormente.

Primeiro, você aplica a técnica do exemplo anterior, de usar o SELECT para mostrar o valor original e o novo, e vai com calma, ajustando sua expressão regular até ela ficar perfeita, formatando corretamente 100% dos casos. Depois, você utiliza a mesma expressão no UPDATE, corrigindo de uma vez todos os dados:

-- Corrigir todas as placas para o formato AAA-9999

-- MariaDB
UPDATE veiculos
SET placa = REGEXP_REPLACE(placa, '^([A-Z]{3})[.: ]?(d{4})$', '\1-\2');

-- PostgreSQL
UPDATE veiculos
SET placa = regexp_replace(placa, '^([A-Z]{3})[.: ]?(d{4})$', '\1-\2');

-- Oracle
UPDATE veiculos
SET placa = REGEXP_REPLACE(placa, '^([A-Z]{3})[.: ]?(d{4})$', '1-2');

Se você também já perdeu muito tempo de vida fazendo faxina nos dados do banco, sabe que poder usar expressões regulares nestes casos NÃO TEM PREÇO.

E assim, vamos aos poucos resolvendo os problemas causados por pessoas, sistemas e migrações.

Mais sobre banco de dados, acesse a seção: Banco de Dados

Testadores online
  1. Regex101 – Atualiza enquanto digita, destaca texto casado, mostra o conteúdo dos grupos, faz substituição de textos, referência rápida, sintaxes JavaScript, Python e Perl.
  2. RegexPal – Atualiza enquanto digita, destaca texto casado, referência rápida, sintaxe JavaScript.
  3. Debuggex – Cria um gráfico de sua expressão regular. Bom para entender como sua expressão é interpretada pelo computador. Sintaxe JavaScript, Python e PCRE.
  4. Testador de Expressões Regulares – Interface em português, atualiza enquanto digita, mostra se casou ou não usando cores, sintaxe JavaScript.
  5. Rubular – Atualiza enquanto digita, destaca texto casado, referência rápida, sintaxe Ruby.
  6. RegExr Atualiza enquanto digita, destaca texto casado, referência rápida, precisa do Flash Player 9, sintaxe ActionScript.
  7. Regex Powertoy – Atualiza enquanto digita, destaca texto casado, referência rápida, sintaxe Perl e Java.
  8. regex – Atualiza enquanto digita, destaca texto casado, referência rápida, mostra código pronto da linguagem, sintaxe JavaScript, Perl, Python e PHP.
  9. HiFi RegExp Tool – Atualiza enquanto digita, destaca texto casado, referência rápida, exemplo de código em JavaScript, sintaxe JavaScript.
  10. JRX Atualiza enquanto digita, destaca texto casado, referência rápida, sintaxe JavaScript.
  11. Nregex Atualiza enquanto digita, destaca texto casado, referência rápida, sintaxe C#.NET.
  12. Regex Mate Atualiza com botão (estilo console), sintaxe JavaScript.
  13. My Regex Tester Destaca texto casado, explica a expressão, otimiza a expressão, mostra código pronto da linguagem, sintaxe JavaScript, Java, VB.NET, C#.NET, PHP e ASP.
  14. Regexper – Cria diagramas que descrevem o funcionamento de uma expressão regular.
  15. Regular Expression Generator – Gerador de Expressões Regulares. Você digita o texto que quer casar e ele gera um programa pronto para extrair este texto, em várias linguagens, entre elas Python, Perl, PHP, Ruby, Java e javaScript.
  16. Regular Expression Analyzer – Analisador de expressões, que gera uma árvore de sua estrutura, ficando fácil entendê-la. Sintaxe Java, JavaScript e Perl.
  17. reAnimator Cria um gráfico (autômatos finitos) de sua expressão regular. Bom para entender como sua expressão é interpretada pelo computador.
  18. Regexplained Fontes gigantescas, design estiloso. Bom para testes rápidos com strings pequenas.
  19. RegexOne – Tutorial com exemplos interativos que a cada lição vai te ensinando um pouco sobre as expressões.

Gostaria de saber de alguma outra expressão regular ou adicionar aqui a este artigo?

Leia também:

FAQ Avançado: Os 5 Maiores Erros ao Usar Regex em Produção

1. É verdade que não devo usar Regex para extrair dados de HTML?

A regra de ouro número um. O HTML não é uma linguagem regular (ele possui tags aninhadas infinitas). Tentar usar Regex para fazer “parse” de HTML quase sempre resulta em falhas em casos extremos, códigos ilegíveis e brechas de segurança. Em ambientes Node.js, use bibliotecas como o Cheerio ou o JSDOM. Deixe a Regex para validar strings simples (como e-mails e CPFs).

2. O que é o Catastrophic Backtracking (ReDoS) que derruba servidores?

O ReDoS (Regular Expression Denial of Service) ocorre quando você escreve uma Regex com quantificadores agrupados repetitivos (ex: (a+)+$). Quando essa Regex recebe uma string maliciosa que “quase” dá match, o motor da Regex entra em um loop exponencial tentando todas as combinações possíveis. Como o JavaScript no Node.js é single-threaded, esse loop trava a CPU inteira (100%), derrubando a sua API. Sempre valide as Regex geradas por IA em ferramentas como o Regex101 para ver a quantidade de “steps” (passos) da execução.

3. Por que o método .test() do JavaScript às vezes retorna falso para a mesma string?

Esse é o bug clássico que faz os desenvolvedores juniores perderem horas. Se você cria uma Regex global (com a flag /g) e a salva numa constante, ela guarda “estado”. Após rodar regex.test('texto') a primeira vez, ela avança o índice (lastIndex). Se você rodar novamente na mesma string sem resetar o índice, ela buscará a partir do final e retornará false. Para validações simples de true/false, evite usar a flag /g.

4. Devo usar Regex para validar senhas (1 maiúscula, 1 número, etc)?

Você pode usar Lookaheads (ex: (?=.*[A-Z])) para validar senhas em uma única Regex, mas isso fere os princípios do Clean Code. É muito mais legível (e seguro) para a sua equipe validar cada regra separadamente no backend: um if para o tamanho, um para verificar números e outro para letras. A Regex deve facilitar a leitura, não se tornar um quebra-cabeça.

5. Como testar se a Regex gerada pela IA (Copilot/ChatGPT) está correta?

A IA costuma acertar o “Caminho Feliz”, mas falha terrivelmente nos Edge Cases (casos extremos). Nunca jogue a Regex direto em produção. Copie o código gerado, cole no site Regex101.com e insira manualmente as strings que não devem passar (ex: e-mails sem domínio, CPFs com letras, etc). Além disso, escreva Testes Unitários (com Jest ou Mocha) cobrindo no mínimo 5 cenários de erro antes de aprovar o Pull Request.

Ramos da Informática
JS TS IA

Pesquisa: Como você está usando IA na sua rotina Dev?

Responda em menos de 2 minutos e ajude a direcionar nossos próximos artigos técnicos, guias e conteúdos.

Responder Pesquisa →
Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

17 Ferramentas No-Code para Validar Seu Negócio

No mundo dos negócios, construir um Produto Mínimo Viável (MVP) não pode ser sinônimo de queimar o caixa da...

Extensões PostgreSQL: Substitua Redis, MongoDB e Kafka com SQL

Dominar as extensões PostgreSQL deixou de ser apenas uma opção para se tornar a principal estratégia de arquitetura em...

State of AI 2026: A Maturidade da Inteligência Artificial

A inteligência artificial deixou definitivamente o território das experimentações e se consolidou como uma peça de infraestrutura fundamental no...

Construindo um Servidor MCP Personalizado com Node.js

Um guia prático para construir seu próprio servidor MCP para enriquecer as respostas de ferramentas de IA com contexto...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Como gerar tipos TypeScript direto do PostgreSQL com Kanel

Você já passou por aquela situação trágica de adicionar uma coluna nova no banco de dados e esquecer de...

Adeus, VS Code? Por Que o Cursor AI Virou o Favorito dos Devs

Você já imaginou um editor de código que conversa com você, antecipa suas necessidades e escreve trechos inteiros de...

Mais Lidos

Code Llama: Guia Definitivo para Programação

A Meta lançou uma nova ferramenta com inteligência artificial...

50 Dicas do Claude Code: Melhores Práticas para Usar Todo Dia

Você já usa o Claude Code há tempo suficiente...

Indústria 4.0 e IoT: Implementação Prática no Brasil

O termo Internet das Coisas (IoT) é mais antigo...

Function vs Stored Procedure: Qual a Diferença e Boas Práticas

No mundo dos bancos de dados, funções e procedures...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Recursos da Comunidade

Carreira Internacional

JOB NA GRINGA

Meta de Salário Remoto
U$ 5.000/mês

O mapa completo para programadores do Brasil conquistarem contratos internacionais e mudarem de vida financeira.

  • Vagas exclusivas semanais: Membros acessam vagas com 7 dias de antecedência.
  • Workshops e lives gravadas: Buscar vagas não é óbvio. Nós te mostraremos como.
  • 498 Portais de vagas: Que contratam Brasileiros direto na sua dashboard.
  • Mentorias com Recrutadores: Encontros semanais ao vivo com Erika Linares.
  • Inglês diário com foco em conversação: Treine para entrevistas num ambiente sem julgamentos.
  • Suporte pós-contratação: Contabilidade e recebimento legal com a menor taxa.
Garantir Minha Vaga

Inscrição segura via Hotmart

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.