goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

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

4 Respostas para “Aprendendo a pensar com expressões regulares

  1. Francisco 20/12/2010 às 10\1002

    Sobrinhagem? Não terá sido desatenção e pressa, apenas?

    Abs! 🙂

    • goncin 20/12/2010 às 10\1006

      E existe algum tipo de “profissional” mais desatento e apressado que um sobrinho, Chico? 😛

      • Francisco 20/12/2010 às 10\1041

        Aproveitando, sobre o lance do uso de Exp. Regulares: acredito que isso dependa da linguagem – cada caso é um caso. Lembro duma lição sobre Python em que era justamente sobre tratamento de numerais romanos. Era possível se resolver de duas formas: usando métodos das Strings (ex: Nome.replace(), etc) ou as Exp. Regulares. O autor explicou que ambas as maneiras funcionavam bem, tinham bom desempenho (ambos os recursos eram em C), etc. e usou os métodos de Strings no caso porque eram mais simples (“fáceis”) do que as RegExp.

        Enfim, opinião de sobrinho, rs, 🙂

        Ah, e os exemplos de se usar as Exp. Regulares para lidar com telefones e numerais romanos podem ser encontrados no “Dive into Python”.

        Abs

      • goncin 20/12/2010 às 10\1048

        Chico,

        A vantagem do Python – assim como a do Perl – é que essas linguagens têm as expressões regulares no seu DNA. Foram concebidas utilizando-se os conceitos das ERs, o que as tornam tão produtivas para esse tipo de tarefa. Para o resto de nós, que não usa nenhuma dessas duas linguagens, é um poder que foi posto ao nosso alcance, mas requer um ritual de iniciação. Algo como uma Maçonaria ou uma Ordem Rosacruz 😉

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: