Expressões Regulares - Regex: o guia completo

Expressões Regulares – Regex: o guia completo

O que são Expressões Regulares

Uma expressão regular é uma forma comum de representar algum tipo de padrão em texto. Quer aprender mais sobre? Confira agora nosso guia!

Tempo de Leitura: 5 minutos

No mundo da computação, você já deve ter se deparado com o problema para identificar padrões em um texto e cuja solução tem te consumido várias linhas de código e uma lógica um tanto quanto complexa de ser escrita e até mesmo de ser compreendida

Esse é um cenário perfeito para utilizarmos o poder das expressões regulares ou "regex". 

Continue a leitura para aprender tudo sobre!

Conheça a Casa do Desenvolvedor

O que são Expressões Regulares?

As expressões regulares, frequentemente abreviadas como "regex" ou "regexp", são uma poderosa ferramenta utilizada em programação e processamento de texto para lidar com padrões de caracteres.

Elas são escritas em uma linguagem formal baseada na teoria das linguagens formais. Essa linguagem permite descrever um conjunto de cadeias de caracteres e regras para encontrar, validar ou manipular informações de acordo com esses padrões.

A importância das expressões regulares na programação é inquestionável, uma vez que muitas linguagens de programação se baseiam nessa teoria, o que possibilita aplicar essas regras em praticamente qualquer linguagem de programação.

Onde podem ser aplicadas as Expressões Regulares?

As expressões regulares são versáteis e encontram aplicação em diversos contextos:

  1. Validação de Dados: Uma das principais aplicações das expressões regulares é validar dados de entrada. Por exemplo, podemos usar uma expressão regular para verificar se um endereço de e-mail fornecido pelo usuário segue o formato correto.

  2. Extração de Informações: Expressões regulares permitem extrair informações específicas de textos. Isso é útil em tarefas como análise de logs, onde você pode buscar por padrões específicos, como datas ou números de série.

  3. Substituição de Texto: Você pode usar expressões regulares para substituir partes de um texto por outras. Isso é útil para formatação de texto, substituição de palavras-chave ou limpeza de dados.

  4. Pesquisa em Ferramentas de Edição de Texto: Além de serem usadas em programação, as expressões regulares são amplamente empregadas em ferramentas de edição de texto, como editores de código e processadores de texto. Geralmente, você pode realizar pesquisas avançadas usando atalhos, como CTRL+F.

  5. Análise de Linguagem Natural: Em processamento de linguagem natural, expressões regulares são usadas para analisar e segmentar textos em partes significativas, como frases ou palavras-chave.

  6. Validação de Senhas: Expressões regulares podem ser aplicadas para impor políticas de senha seguras, garantindo que as senhas atendam a requisitos específicos, como a inclusão de números e caracteres especiais.

Principais conceitos

Para começarmos a entender quais são essas regras, precisamos entender como se organizam e para que servem cada conjunto de caracteres

Metacaracteres

A maioria dos caracteres são literais, ou seja, casam somente com eles próprios, por exemplo t teste "t", as exceções são os metacaracteres

. ? * + $ ^ \ { } [ ] ( ) |

Cada metacaractere representa um grupo distinto sendo elas: Classes, Quantificadores, Agrupamento, Ancoras e outros

Classes

São definidas entre colchetes [], isso indica que estamos buscando especificamente o caractere informado dentro dos colchetes

por exemplo, dado determinado texto quero que encontre a letra "a" então escrevemos o seguinte padrão [a]

existem várias classe de caracteres prontas que podemos utilizá-las para facilitar nossas operações

estas são algumas classes comumente utilizadas

[A-Z] - significa de A até Z, sempre maiúscula.

[a-z] - significa de a até z, sempre minúscula,

[A-Za-z] - significa A-Z ou a-z.

\d - significa todos os dígitos e é atalho para [0-9]

\w - significa word char e é um atalho para [A-Za-z0-9_].

\s significa whitespace normalmente é um atalho para [ \t\r\n\f] onde:

O primeiro caractere é um espaço branco.

\t é um tab.

\r é carriage return.

\n é newline.

\f é form feed.

Quantificadores

São identificadores para dizer quantas vezes determinada expressão deve aparecer em sequência

? - zero ou uma vez.

* - zero ou mais vezes.

+ - uma ou mais vezes.

. - o "ponto" que significa qualquer caractere

{ e } - as chaves servem para definir uma quantidade de caracteres específicas que é desejado encontrar

 Por exemplo:

  a{3} - letra a 3 vezes.

{n} - exatamente n vezes.

{n,} - no mínimo n vezes.

{n,m} - no mínimo n vezes, no máximo m vezes.

Com \ (barra) podemos escapar metacaracteres, se quisermos procurar pelo * ou . literalmente (sem significado especial), devemos utilizar o caractere \

Por exemplo: \..

Podemos combinar classes com quantificadores o que nos dá ainda mais poder pesquisar informações, alguns exemplos:

\d*- um dígito, zero ou mais vezes

[.-]*   - ponto ou hífen zero, uma ou mais vezes.

[.-]{1} - ponto ou hífen uma vez.

[.-]?   - ponto ou hífen zero ou uma vez.

Agrupamentos

São representados pelos metacaracteres ( ), utilizamos para agrupar regras ou extrair informações 

() - Declaramos um grupo 

?: - Non-Capturing group

exemplo (?:de\s+)  não deve devolver o grupo formado pela preposição de e por um \s

Âncoras

Quando precisamos encontrar determinada informação delimitando uma parte da informação podemos usar as âncoras:

\b - (minúsculo) é uma âncora que seleciona um word boundary, isso é o início ou fim da palavra. 

^  - Garantir que nada vem antes.

$ - Garantir que nada vem depois.

\B - (B maiúsculo) non-word-boundary comportamento inverso a sílaba alvo deve aparecer dentro de uma palavra, nunca no início ou fim.

Negação

Às vezes é mais vantajoso selecionarmos a informação que não queremos e para isso podemos utilizar

\W  - (maiúsculo) é a non-word char, ou seja, tudo que não é um word char. \W é um atalho para [^\w].

\D  - (maiúsculo) é um non-digit, sendo \D um atalho para [^\d] 

Repare também que não usamos a metacaractere ^ como âncora, pois aparece dentro de uma classe [^>]

Com esses conceitos estabelecidos já é possível criar um regex para uma finalidade específica ou então compreender um padrão já existente que precise ser modificado

Vamos analisar um exemplo do cotidiano que utilizamos regex

regex para validação de formatação de CPF:

(\d{3})[.]?(\d{3})[.]?(\d{3})[-]?(\d{2})

Separando em cores podemos perceber que existem um conjunto de regras sendo aplicadas com o objetivo de validar se a informação está no formato correto de um CPF

Vamos descrever a regras e exibir a parte correspondente desta regra

CPF é composto  por

  • 3 dígitos e após os dígitos pode ou não estar separados por um ponto

(\d{3})[.]?

  • Seguido de mais 3 dígitos e após os dígitos pode ou não estar separados por um ponto

(\d{3})[.]?

  • Seguido de mais 3 dígitos e após os dígitos pode ou não estar separado por um traço

(\d{3})[-]?

  • Seguido de mais 2 dígitos

(\d{2})

Agora, vamos analisar mais um regex ^([\w]\.?)+@([\w]+\.)+([a-z]{2,4})+$ que é bastante utilizado e a princípio parece bem complexo, mas quando separamos cada parte da regra, quebramos essa complexidade e fica mais simples de entender qual o objetivo desta expressão como um todo

Vamos separar visualmente em cores para facilitar a compreensão

^([\w]\.?)+@([\w]+\.)+([a-z]{2,4})+$

Agora vamos descrever cada regra pelas suas cores

  • âncora que define que nada deve vir antes
    • agrupe
      • Classe de caracteres (letras e números)
      • Caractere literal ponto pode aparecer 0 ou 1 vez
    • deve aparecer uma ou mais vezes
  • deve conter o caractere literal @
    • agrupe
      • Classe de caracteres (letras e números) 1 ou mais vezes
      • caractere literal ponto pode aparecer 0 ou 1 vez
    • deve aparecer uma ou mais vezes
    • agrupe
      • Classe de caracteres (apenas letras minúsculas)
        • no mínimo 2 e no máximo 4 caracteres
    • deve aparecer uma ou mais vezes
    • âncora que define que nada deve vir depois

Agora que descrevemos cada regra, podemos concluir que este regex é uma validação de e-mail, dada suas regras se enquadram nesse tipo de validação.

Ficou com alguma dúvida? Acesse nosso fórum e tire todas as suas dúvidas e troque conhecimento!

Diante de todos estes conceitos apresentados podemos concluir que, expressão regulares são um grande aliado, para solucionar de forma ágil e eficaz problemas cotidianos na validação de dados e como se trata de um padrão baseado em uma teoria da computação pode ser facilmente transcrita em qualquer linguagem de programação e ser reutilizado em várias soluções.


Conteúdo atualizado em 27/09/2023 pela Redação CdD
Gilmar Piccin
Gilmar Piccin
Formado em sistemas de informação, pós-graduado em desenvolvimento de software desktop, desenvolvedor backend da TecnoSpeed

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Pular para o conteúdo