Perdendo o medo de Expressões Regulares

em Desenvolvimento.

Vamos começar com um exemplo: A RFC 822 define um padrão para mensagens de texto na internet, que é basicamente o que conhecemos como e-mail.

Nesta especificação (que pode ser lida em detalhes aqui) define-se o que é considerado um endereço de e-mail válido.

Com base nisso, existem Expressões Regulares criadas para garantir que um e-mail digitado, atenda aos requisitos desta especificação. Existem várias implementações, mas podemos dizer que basicamente todas se parecem com isso:

[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\
()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:

Coloquei apenas alguns trechos aleatórios, se fosse reproduzir ela por completo, seriam mais de 80 linhas disso aí que você está vendo acima. Caso queira ver a expressão por completo, clique aqui!

tentando entender expressões regulares

Se sentiu assim tentando ler a Expressão regular? Conseguiu entender perfeitamente, não é mesmo?

Muitas vezes, buscando na internet, ao tentar validar um e-mail digitado pelo usuário, este é o resultado que encontramos e acaba sendo o primeiro contato de algumas pessoas com uma Expressão Regular. E aí você pensa: car#%$@*! Eu nunca vou entender isso!

Pra piorar um pouco mais as coisas, a fim de curiosidade, uma das engines mais famosas e utilizadas para Expressão Regular é a Oniguruma. Se você usa Ruby, PHP, Perl, algum editor como o Sublime Text, TextMate ou Atom, é muito provável que esta engine está sendo utilizada para processar suas Expressões Regulares.

Segundo a Wikipédia, Oniguruma em japonês (鬼車) significa “Oni’s Chariot”, que na mitologia Japonesa é a representação de um Ogro Demônio. Algo tipo isso:

aparência de um Oni's ChariotCréditos da imagem: http://l5r.wikia.com/wiki/Uzaki_no_Oni

Ou seja, ao olhar o exemplo de Expressão Regular acima e o significado do nome de uma das principais engines existentes, a conclusão é clara: Isso só pode ser coisa do capiroto.

Mas calma, antes de entrar embaixo da mesa e começar a chorar em posição fetal se arrependendo de sua escolha de carreira, vamos entender Expressões Regulares na prática e ver que não são assim tão complexas e assustadoras quanto aparentam.

Para que serve uma Expressão Regular?

Basicamente temos as seguintes aplicações comuns para Expressões Regulares em um texto: Validar o seu conteúdo, realizar substituições ou extrair informações.

Você quer saber se um e-mail é válido? Se uma senha possui pelo menos um número e uma letra com o mínimo de 8 caracteres? Quer substituir todas as palavras que começam com vogais por “roxo”? Substituir todas as vírgulas por enters (quebras de linha)? Contar quantas palavras começam com letra maiúscula em todo o texto? É aí que entra a Expressão Regular para facilitar a nossa vida.

Algo bacana é que praticamente qualquer linguagem oferece suporte à Expressões Regulares e todas elas possuem o mesmo padrão. Ou seja, é provável que uma Expressão Regular escrita em um código PHP irá funcionar perfeitamente em um código JavaScript por exemplo.

Então, aprendendo uma vez como funcionam, você irá conseguir utilizá-las em qualquer linguagem.

Como escrever Expressões Regulares

Para começar a escrever, basta entender que o “código-fonte” de uma Expressão Regular nada mais é do que alguns códigos que representam o que será buscado em um texto.

A primeira coisa que temos são as classes de caracteres.

Por exemplo, a expressão \d significa qualquer dígito numérico. O resultado dela aplicada em um texto seria:

Lorem ipsum 1234 dolor 5678 sit amet.

A expressão \s significa qualquer espaço em branco, que seria:

Lorem ipsum 1234 dolor 5678 sit amet.

Já a expressão . (apenas um ponto mesmo) significa qualquer caractere:

Lorem ipsum 1234 dolor 5678 sit amet.

E assim por diante, temos várias classes de caracteres como: qualquer valor numérico, qualquer valor não numérico, qualquer espaço, qualquer caractere que não for espaço, qualquer caractere que for um alfanumérico, qualquer caractere que não for um alfanumérico, e por aí vai.

O segundo ponto importante que temos são os quantificadores.

Podemos querer identificar dígitos numéricos, porém pegando apenas os 3 primeiros valores encontrados. Para isso utilizamos a expressão \d{3}, que resultará em:

Lorem ipsum 1234 dolor 5678 sit amet.

Para começar a expandir um pouco, vamos criar uma expressão que identifique o seguinte padrão:

  • Sequência de valores não numéricos (podemos dizer que são letras): \D
  • Deve conter um espaço antes da sequência: \s
  • Deve conter um espaço depois da sequência: \s
  • A sequência deve possuir entre 3 e 5 caracteres: {3,5}

A expressão para isto seria então \s\D{3,5}\s, com o seguinte resultado:

Lorem ipsum 1234 dolor 5678 sit amet.

Olhando apenas a expressão parece ser complexo, mas entendendo que cada pedacinho da expressão possui um significado muito bem definido, fica fácil começar a ligar as coisas e entender o que está acontecendo.

Um outro exemplo de quantificador seria identificar qualquer sequência de caracteres com a expressão . que apareça zero ou mais vezes com a expressão * depois da palavra dolor, criando então a expressão dolor.* que resultará em:

Lorem ipsum 1234 dolor 5678 sit amet.

Outro recurso comum são as âncoras, utilizadas para “começa com” ou “termina com”, exemplos:

Começa com a letra L: ^L

Lorem ipsum 1234 dolor 5678 sit amet.

Termina com amet.: amet\.$

Lorem ipsum 1234 dolor 5678 sit amet.

No exemplo acima, você deve ter notado que antes do . utilizamos o caractere \. Isso acontece quando queremos escapar algo. Um . significa qualquer caractere, logo, se queremos de fato encontrar apenas o caractere ., precisamos escapá-lo para que ele não seja interpretado como qualquer caractere. Para isso utilizamos uma \ antes sempre que queremos escapar algo.

Existem ainda expressões para grupos, padrões, condicionais, etc. Mas não vamos nos alongar muito no assunto aqui… O importante é entender que cada pedacinho de uma expressão possui um significado muito claro. Não é preciso se assustar ao ver uma expressão confusa ou muito grande, basta olhar com calma e quebrar cada pedacinho dela que você entenderá exatamente o que acontece.

A dica que dou para quem deseja entender mais sobre o assunto é experimentar. Existem diversas ferramentas online para testar Expressão Regulares, com ajuda, referência e exemplos, deixo aqui algumas indicações que uso com frequência:

Vamos criar mais um exemplo prático, uma expressão muito simples para entender como poderíamos extrair todos os e-mails de um texto. A lógica seria mais ou menos algo como:

[alfanuméricos][arroba][alfanuméricos][ponto][alfanuméricos] ou
[alfanuméricos][arroba][alfanuméricos][ponto][alfanuméricos][ponto][alfanuméricos]

As regras:

  • Qualquer sequência de caracteres alfanuméricos com um ou mais: \w+
  • Seguido de um @: @
  • Seguido de outra sequência alfanumérica com um ou mais: \w+
  • Seguido de um . (ponto): \.
  • Seguido de outra sequência alfanumérica com um ou mais: \w+
  • Seguido de outro ponto que pode ou não existir: \.*
  • Seguido de outra sequência alfanumérica que pode ou não existir: \w*

Criando então a expressão \w+@\w+\.\w+\.*\w* que resultará em:

Lorem ipsum dolor sit@amet.com.br, consectetur adipiscing elit.
Nulla a quam sed@magna.com dictum dignissim in a ante.
Donec sed dictum mauris. In in tellus@nec.io eros bibendum.

Concluindo, Expressões Regulares são muito úteis e poderosas, vale a pena investir o seu tempo para entendê-las.

Como bônus, deixo um site bem legal que possui palavras cruzadas utilizando Expressões Regulares para praticar e se divertir: https://regexcrossword.com/

Fica aqui o desafio para quem conseguir resolver a Hexagonal. Comente abaixo com o resultado… se puder! 

desafio hexagonal
https://regexcrossword.com/challenges/hexagonal

Você também pode gostar