Fala, pessoal. Você sabe o que RegEx significa? A palavra RegEx é uma abreviação de Regular Expression, ou Expressão Regular se traduzirmos para o português. Este conceito é de extrema importância quando falamos de computação, e tem como função reconhecer padrões.
Para fazer esse reconhecimento, uma RegEx é composta de vários símbolos que representam caracteres, grupos de caracteres, quantidades de um determinado caractere ou grupo de caracteres, entre outros.
O uso de RegEx é algo possível em diversas linguagens, no entanto, é importante salientar que muitas linguagens não implementam todos os recursos possíveis dessa tecnologia. Portanto, recursos utilizados em RegEx na linguagem PHP podem não funcionar corretamente na linguagem JavaScript, por exemplo.
Nesse artigo eu vou explicar um pouco sobre os conceitos básico de uma RegEx e onde ela pode ser utilizada ao mostrar alguns exemplos. Vamos lá?
Conceitos básicos – sintaxe
Primeiramente, vamos começar entendendo o significado de alguns caracteres utilizados nas RegEx:
- [ ] transformam os elementos digitados entre os colchetes em um grupo de caracteres;
- { } indicam uma quantidade – podemos especificar uma quantidade específica como {3}, uma quantidade mínima {5,} (5 ou mais) ou um intervalo {2,10} (entre 2 e 10);
- | indica uma alternância entre dois símbolos, como na expressão a | b onde tanto o caractere a quanto o caractere b podem ser aceitos;
- . o ponto é uma espécie de coringa, já que representa um símbolo qualquer;
- ? o ponto de interrogação é também um quantificador e quando colocado ao lado de um símbolo representa zero ou uma ocorrências daquele símbolo, mas quando colocado ao lado de um grupo, representa zero ou uma ocorrência de algum dos elementos dentro do grupo
- + o símbolo de mais é um quantificador muito parecido com o ponto de interrogação e também pode ser utilizado ao lado de um símbolo ou de um grupo. No entanto, diferentemente do ponto de interrogação o símbolo de mais representa uma ou mais ocorrências do elemento, ou seja, de uma até infinitas ocorrências.
- * O asterisco também é um quantificador e pode ser utilizado da mesma maneira que o símbolo de +, no entanto, possui uma diferença. Ele também irá reconhecer zero ocorrências do elemento em questão.
Conceitos básicos – grupos
Nós também podemos utilizar alguns grupos nas RegEx. Vamos conferir alguns exemplos abaixo:
- [a-z] : reconhece os caracteres minúsculos de a à z
- [A-Z] : identifica os caracteres maiúsculos de a à z
- [0-9] : reconhece os caracteres de zero à nove
- [a-zA-Z] : identifica os caracteres de a à z independentemente se são maiúsculos ou minúsculos
- [a-zA-Z0-9] : reconhece as letras de a à z tanto maiúsculas quanto minúsculas e os números de zero a nove
- \s : representa o grupo dos caracteres espaço, que incluem identações, espaços, enters, etc.
Uma coisa importante que precisamos ter em mente é que alguns caracteres como é,ç,ã,ü,í, à, etc, não estão incluídos no conjunto de caracteres de a à z. Portanto, caso você precise trabalhar com este tipo de caractere na sua expressão regular, serão necessárias mais algumas etapas que não abordaremos nesse artigo.
RegEx 101
Para entendermos melhor o que são as RegEx, vou utilizar nesse artigo um site chamado RegEx101 que você pode acessar clicando aqui.
Nesse site, podemos escolher qual especificação de implementação das RegEx queremos utilizar, assim como testar uma RegEx de maneira rápida. O site também oferece uma referência rápida sobre alguns recursos das RegEx e até mesmo uma explicação do que a sua RegEx faz.
Eu selecionei a implementação das RegEx que está relacionada à linguagem JavaScript e coloquei o texto abaixo como teste. Nesse texto temos alguns endereços de IP e alguns telefones fictícios.
192.168.0.1
+55 (00) 1234-5678
192.168.10.102
192.168.1041.102
192-168-0-102
192.168.0.125
+55 (00) 91234-5678
+55 (00) 912345678
E agora podemos testar algumas expressões regulares, para, por exemplo, encontrar no texto de teste os IPs que possuem uma formatação válida.
Regex para encontrar endereços de IP com formatação válida
Sabendo que um IP tem o formato XYZ.XYZ.XYZ.XYZ, podemos usar a expressão [0-9]{3}
para encontrar três números seguidos e em seguida, podemos especificar depois disso o caractere “.”.
Como o ponto é um caractere utilizado na criação de RegEx, precisamos usar também o caractere de escape \ para que o ponto seja entendido como um caractere e não algo das próprias RegEx.
Como os dois primeiros grupos de números do endereço sempre terão 3 números, basta copiar essa expressão duas vezes para reconhecê-los e, para reconhecer os dois últimos, precisamos levar em consideração que estes podem ter de uma a três ocorrências, então fazendo uma modificação no quantificador entre parênteses e repetindo novamente acabamos com a expressão [0-9]{3}\\.[0-9]{3}\\.[0-9]{1,3}\\.[0-9]{1,3}
que irá reconhecer a formatação correta de um endereço de IP.
Outro teste que podemos fazer é para reconhecer os números de telefone da string de teste.
Regex para encontrar números de telefone
Como esses números sempre começarão com +55, podemos iniciar nossa expressão regular com \\+55
já que o símbolo de mais também precisará do caractere de escape.
Também podemos pensar em casos que não estão na nossa string de teste e colocar que depois do símbolo de mais podemos ter dois números quaisquer, o que faz com que fiquemos com a Regex \\+[0-9]{2}
.
Depois disso, podemos ou não ter um espaço, então utilizaremos \\s?
para que haja o match se houver zero espaços ou um espaço.
Com isso, temos que reconhecer o DDD entre parênteses, e novamente temos caracteres especiais envolvidos na história: os parênteses. Por isso, precisaremos utilizar o caractere de escape tanto no abre parênteses quanto no fecha parênteses, e dentro dos parênteses podemos ter qualquer conjunto de dois números, o que faz com que precisemos da expressão \\([0-9]{2}\\)
para fazer o match dos parênteses com o DDD.
Assim, podemos nos preocupar com o número de telefone em si, já que os números de telefone começam com o número 9, podemos então colocar o número na expressão e teremos duas opções para o número ser válido.
A primeira é termos oito números depois deste nove, e a segunda é termos quatro números, um hífen e mais quatro números. O primeiro caso pode ser encontrado com a expressão [0-9]{8}
e a segunda com a expressão [0-9]{4}-[0-9]{4}
, então basta utilizar o operador de alternância entre essas duas operações, mas para isso precisamos colocá-las entre parênteses, ou seja, ficamos com a expressão ([0-9]{8} | [0-9]{4}-[0-9]{4})
Juntando todas essas expressões, acabamos com a expressão \\+([0-9]{2})\\s\\([0-9]{2}\\) \\s?9([0-9]{8}|[0-9]{4}-[0-9]{4})
que irá reconhecer apenas os números de telefone válidos.
Considerações finais
Como você pode ter percebido, o uso de expressões regulares proporciona uma maneira muito atrativa para fazer o reconhecimento de padrões. No entanto, conforme a complexidade do padrão que queremos identificar aumenta, a expressão pode ficar muito complexa, tanto do ponto de vista computacional quanto do ponto de vista de entendimento.
Não é incomum também que as expressões regulares impactem em um desempenho menor do que alternativas que não utilizem esse conceito. Sendo assim, sempre é preciso avaliar com cuidado se a utilização de expressões regulares realmente será a melhor opção para o problema que você deseja selecionar.
Por hoje é isso, pessoal. Espero que esse artigo tenha ajudado vocês e até a próxima!