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!
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:
-
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.
-
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.
-
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.
-
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.
-
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.
-
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
- agrupe
- 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
- Classe de caracteres (apenas letras minúsculas)
- deve aparecer uma ou mais vezes
- âncora que define que nada deve vir depois
- agrupe
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.