Em terra de metacaractere, quem tem um asterisco é rei

11 Sep 2008

Em terra de metacaractere quem tem um asterisco é rei

Não entendi absolutamente NADA!
Calma! Eu lembrei de você, e preparei esse mini-tutorial para você aprender hoje mesmo como criar expressões regulares simples! Prepare-se para avançar mais um grau na escala da nerdisse!

Expressões regulares? Isso é algum tipo de regra de português? Eu detestava aquelas aulas…
Não, não… é algo bem mais complexo e… divertido. Vamos imaginar a seguinte situação: você trabalha numa empresa de desenvolvimento de software como programador (claro, afinal, esse exemplo seria inviável se você fosse o faxineiro) e seu chefe pediu para o Vagabond Controlator Plus, o software que você está desenvolvendo, ser capaz de ler arquivos de texto com registros dos acessos dos funcionários ao sistema de ponto da empresa, estruturado dessa forma:

12:45 Tinkie Winkie
13:50 Dipsie Silva
14:30 Lala Tasty Cream
14:50 Po McCartney
20:20 Bozo The Clown

Sua missão, bravo guerreiro, é descobrir quais funcionários estão chegando atrasados na empresa (depois das 14h). Como você faria isso?

Ah, é fácil! Basta ler o arquivo, gerar uma string para cada linha, separar a parte da hora e converter para número, aí verifica se…
Pára! Trabalho demais para pouca coisa. As ER (expressões regulares) existem para te ajudar. Com elas podemos buscar e substituir informações em um texto, de forma rápida e fácil. Para o exemplo acima, uma das possíveis expressões pode ser simplesmente:

^(1[4-9]|2[0-3]):[0-5]\d.*$

Minha nossa, o que é ISSO!?
Calma! Não entre em pânico! Depois de algum estudo, essa monstruosidade acima pode ser facilmente compreendida. Como o assunto é muito extenso, vou explicar apenas os conceitos abordados no quadrinho. Dica: use o RegexPal para testar as expressões, inclusive o exemplo acima. Lembre de marcar a caixinha ““.

1 – O ponto
O ponto casa com qualquer coisa. Ex:

Expressão:  m.t.
Texto:        Ele entrou no mato com a moto

A expressão significa: ache palavras que comecem com m, tenham um caractere qualquer na segunda posição, um t, e termine com um caractere qualquer. Assim, ele encontra as palavras mato e moto. Agora dê um pulinho no RegexPal e faça o teste. Legal, não?

2 – O metacaractere guloso
Quando um ponto se junta a um asterisco, ele fica malvado e vira o curinga (não é aquele do Batman), um ser maligno devorador de mundos, caracteres e criancinhas. O asterisco ao lado dele significa: “ache zero ou mais caracteres quaisquer”.

Expressão: a.*i
Texto:       aaaaaaai! Meu pé, seu idiota!

No exemplo acima, o esperado seria que a expressão casasse com “aaaaaaai“, mas ele casou até a última letra “i” da frase, porque o .* é ganancioso e não mede esforços para conseguir aquilo que deseja. Ele devora tudo que vê pela frente. Isso é útil em alguns casos, mas não se deve exagerar, caso contrário a ER poderá casar com caracteres indesejáveis.

Nota: Os metacaracteres são caracteres especiais que servem para montar nossas expressões. Exemplos:  (., *, +, ?, [], (), {}… ).

3 – Entrando na lista dos procurados
Com a lista podemos determinar quais caracteres estamos procurando numa determinada posição. A lista é um conjunto de caracteres entre colchetes. Ex:

Expressão: [mprg]ato
Texto:       o gato pegou o rato, que mordeu o pato, que entrou no mato

Traduzindo: procure palavras que comecem com “m”, “p”, “r” ou “g” e terminem com “ato”. Se colocarmos o coringa dentro de uma lista, o que acontece? Como Aurélio diz em seu livrinho de expressões regulares, “dentro da lista, todo mundo é normal”. Ex:

Expressão: [.*]
Texto:       Olá. Sua senha é ****.

O curinga perde seus poderes de devorador de mundos e torna-se uma expressão “ache um ponto ou um asterisco”, e casa apenas com os pontos e asteriscos do texto. Vira um caractere normal, sem poderes e tendo que pegar ônibus para trabalhar.

4 – Grupo de apoio
Tal como em expressões matemáticas, servem para simplificar e organizar a ER, além de outras vantagens: Ex:

Expressão: (casa|testa)mento
Texto:       Vovô fará seu testamento após o casamento de Annie

A ER procura por palavras que começam com “casa” ou “testa” e terminam com “mento”. Note a barrinha |. Ela significa OU. Ou uma coisa ou outra. Se você tirar os parênteses, a expressão passará a significar: ache a palavra “casa” ou a palavra “testamento”. Teste isso no RegexPal.

5 – A recuperação
Depois de ganhar um pouco de bom-senso, nosso metacaractere deixa de ser guloso e passa a ser altruísta. No grupo de apoio, instruíram ele a sempre andar com um sinal de interrogação, o que o torna menos capitalista, e casa apenas o necessário. Vamos voltar ao exemplo 2:

Expressão: a.*?i
Texto:       aaaaaaai! Meu pé, seu idiota!

Agora sim! Com um sinal de interrogação no final, ele vai parar de casar caracteres até encontrar o primeiro “i”. Pronto! O mundo está livre de mais um louco facínora.

6 – E todos foram felizes para sempre
E para que isso aconteça, você precisa ir além. Minhas sugestões:

Definição na Wikipédia
aurelio.net (Este post foi inspirado no livrinho do Aurélio. Compre!)
regexpal.org (para testar)
regular-expressions.info
Como criar expressões regulares em Python
Cheat Sheet de regex (guia rápido)