goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

Arquivos de tags: expressões regulares

Aprendendo a pensar com expressões regulares

Vivendo e aprendendo. Parece não haver máxima mais certeira quando se trata da vida de um #SouDev 😉 .

No meu último post, no qual tratei sobre normalização de nomes próprios, eu havia utilizado uma expressão regular para testar se determinada parte de um nome corresponde a um numeral romano. Antes de encontrar a expressão regular para fazer o teste, eu já estava quebrando a cabeça para escrever uma rotina para fazer a mesmíssima tarefa. Eis o que eu pensava em fazer:

  • Testar se a substring continha apenas caracteres válidos para números romanos – no caso, ‘I’, ‘V’, ‘X’, ‘C’, ‘D’ e ‘M’. Essa era a parte fácil.
  • Determinar se os ditos caracteres estavam na ordem e na quantidade corretas para representar um número romano válido – e era aí que a porca torcia o rabo.

Pelo meu método de raciocínio costumeiro, essa rotina teria alguns loops e outros tantos ifs, e, com certeza, não teria menos que dez linhas de código PHP. Ao pesquisar sobre a estrutura dos números romanos, deparei-me com a expressão regular que você pode observar na linha 18 da listagem daquele post (e que foi utilizada na linha 100). Com ela, resolvi meu problema em uma única linha.

Se eu havia sido esperto nessa parte do código, cometi uma sobrinhagem na parte em que eu precisava substituir todas os espaços duplos por espaços simples. Desde sempre, utilizei um laço para substituir todas as ocorrências de dois espaços por um único espaço, até que não houvesse mais nenhum daqueles. Desta forma:

<?php
while(mb_strpos($nome, self::NN_ESPACO_DUPLO) != false)
      $nome = mb_ereg_replace(self::NN_ESPACO_DUPLO, self::NN_ESPACO, $nome);

Isso funciona assim: se houver quatro espaços contíguos, na primeira passagem esses quatro tornar-se-ão dois. Somente na segunda passagem é que esses dois espaços serão reduzidos a apenas um, que é o resultado desejado. Quanto mais espaços contíguos, mais repetições serão necessárias.

E tudo isso se resolve, de forma muito mais elegante e eficiente, também com uma expressão regular, e em uma única instrução. E o melhor: independentemente da quantidade de espaços contíguos.

<?php
$nome = mb_ereg_replace('\s+', ' ', $nome);

A mágica reside na expressão regular \s+. O que ela significa? \s encontra espaços em branco, e o modificador + indica uma ou mais ocorrências. Era tudo o que eu precisava. E já corrigi o código do post anterior.

As expressões regulares, ao mesmo tempo que encantam com seu poder, também costumam assustar pela sua relativa complexidade. Antes de continuar, vale um definição do que são expressões regulares, provida pela Wikipédia:

Em ciência da computação, uma expressão regular (ou o estrangeirismo regex, abreviação do inglês regular expression) provê uma forma concisa e flexível de identificar cadeias de caracteres de interesse, como caracteres particulares, palavras ou padrões de caracteres. Expressões regulares são escritas numa linguagem formal que pode ser interpretada por um processador de expressão regular, um programa que ou serve um gerador de analisador sintático ou examina o texto e identifica partes que casam com a especificação dada.

Creio que isso esclarece (quase) tudo, mas vou colocar as coisas em termos mais práticos. A palavra regular provém do latim regula, -ae, que significa, ao mesmo tempo, regra e régua. Isso permite afirmar que as expressões regulares têm aplicação quando precisamos encontrar ou extrair ocorrências de caracteres de um texto, no qual ditos caracteres obedecem a determinados padrões (regra) e/ou se encontram em posições previsíveis (régua). E texto, nesse sentido, significa tanto um campo de número de telefone quanto uma cadeia com alguns milhares de caracteres.

Portanto, da próxima vez em que você precisar encontrar ou extrair determinadas substrings de um texto, e seu código começar a ficar mais complexo do que deveria, considere utilizar expressões regulares. Todas as linguagens importantes, hoje em dia, têm algum tipo de suporte a elas. É o tipo de conhecimento que vale o tempo em que se investe nele – uma hora gasta para aprendê-las pode poupar algumas de trabalho brabo 😛 .

Para aprender:

Anúncios

Validando números de telefone com expressões regulares

A privatização do setor de telecomunicações, em meados da década de 90, universalizou o acesso dos brasileiros aos serviços de telefonia. De quebra, organizou a estrutura numérica dos terminais telefônicos: antes tínhamos códigos de área (códigos DDD) de três e quatro dígitos, e os números de telefone variavam entre de 5 a 7 dígitos. Atualmente, no país, todos os códigos de área têm dois dígitos e os números de telefone, oito. Essa estrutura uniforme torna possível validar números de telefone utilizando expressões regulares. Vejamos como.

Validando códigos de área (DDD)

Os código de área possíveis no Brasil vão de 10 a 99. Portanto, a expressão regular para validar códigos de área é

[1-9][0-9] (10)|([1-9][1-9])

UPDATE:  O Alexandre Taz, em seu comentário, alertou que o único DDD válido terminado em 0 é o 10, que será implementado em breve na Grande São Paulo, e observou também que prefixos iniciados com o número 6 também foram reservados para celulares. As expressões regulares foram alteradas para refletir essas alterações. Obrigado, Alexandre!

Trocando em miúdos: na primeira posição, aceitamos dígitos de 1 a 9 e, na segunda, dígitos de 0 a 9. Simples assim.

Se quisermos validar o código de área entre parênteses, como usualmente o código de área é representado, basta acrescentar:

\((10)|([1-9][1-9])\)

Uma vez que os sinais de abre e fecha parênteses porque esses sinais têm significado especial nas expressões regulares, é necessário antecedê-los com uma contrabarra para que sejam considerados literalmente.

Validando números de telefone (incluindo celulares)

Como dito anteriormente, os números de telefone (os de celular, inclusive) têm oito dígitos. O primeiro dígito do prefixo (os quatro primeiros números) pode variar de 2 a 9; números iniciados com 1 são reservados para telefônes de emergência, geralmente com 3 dígitos apenas (190 – polícia; 193 – bombeiros, etc.), e não serão validados. Os outro sete dígitos variam entre 0 e 9. Além disso, entre o quarto e o quinto dígito, vemos normalmente um hífen. De posse dessas informações, montamos seguinte expressão regular:

[2-9][0-9]{3}-[0-9]{4}

Explicando: o primeiro dígito (representado pelo primeiro grupo) pode variar de 2 a 9. A seguir, temos um grupo que pode variar entre 0 e 9 e se repete {3} vezes, seguido pelo hífen. O grupo final também pode variar entre 0 e 9 e se repete {4} vezes.

Validando números de celular

Pelas atuais normas da Anatel, os dígito inicial dos prefixos reservados para números de celular varia entre 7 6 e 9. Logo:

[6-9][0-9]{3}-[0-9]{4}

Foi necessário modificar apenas o primeiro grupo, relativamente à máscara anterior.

Colocando tudo junto

Para os casos em que o código de área será armazenado no mesmo campo que o número do telefone, a expressão regular é:

\((10)|([1-9][1-9])\) [2-9][0-9]{3}-[0-9]{4}

Trata-se simplesmente das máscaras já vistas, colocadas uma após a outra, e com um espaço entre elas para garantir a legibilidade.

Conclusão

Expressões regulares são ótimas para validar dados que obedecem a um padrão. Pesquise, busque, aprenda e melhore suas aplicações com elas. Praticamente todas as linguagens de programação oferecem suporte a elas. Consulte a documentação da sua linguagem para aprender como elas podem ser aplicadas 🙂 .

%d blogueiros gostam disto: