É muito comum encontrar programadores ou especialistas em TI que não conhecem ou não sabem como utilizar expressões regulares. Eu mesmo estou incluído entre eles, pois até então, apesar de conhecer essa poderosa ferramenta, nunca dediquei algum tempo a compreender sua engenharia e conceitos. O intuíto desse artigo não é, de forma alguma, esgotar o assunto, mas apenas introduzir o conceito e uso de expressões regulares para aqueles que não conhecem ou por algum motivo ainda não conseguiram aprender. Vamos começar?
Da Wikipedia, a definição de Expressões Regulares:
Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.
Em outras palavras, com expressões regulares você pode:
- procurar um texto que você não se lembra exatamente como é, mas tem idéia das variações possíveis (pesquisar em extensos arquivos de logs vai ser moleza!);
- procurar um trecho em posições específicas, como no começo ou no fim de uma palavra, linha, parágrafo;
- especificar padrões complexos que podem ser buscados e casados em uma cadeia de caracteres (validar CPF, email, CNPJ, CEP e muitos outros);
- o que mais sua imaginação ou necessidade pedir.
Já está ansioso para pular a teoria e ir para a prática? “Então la vamos nós!”
Para treinar os exemplos demonstrados aqui, sugiro o site gskinner, para testar expressões regulares online.
Antes de começar com um exemplo prático, conheça os metacaracteres usados pelas expressões regulares. Não vou detalhar a função de cada um agora. Isso é conteúdo para vários artigos. Nesse artigo iremos utilizar apenas alguns deles.
. ponto
[] lista
[^] lista negada
? opcional
* asterisco
+ mais
{} chaves
^ circunflexo
$ cifrão
\b borda
\ escape
| ou
() grupo
\1 retrovisor
Mas o qué é um metacaracter? Metacaracteres são caracteres que desempenham funções específicas - dependendo do contexto, ao contrário de um caracter literal.
No primeiro exemplo, temos um arquivo de log com várias linhas, representando o horário que cada usuário acessou um determinado sistema em um certo dia:
05:15 ernesto
08:39 ricardo
10:32 patricia
14:00 gabriel
16:05 paulo
22:14 marcelo
Queremos uma expressão regular que selecione todos os usuários que acessaram o sistema entre as dez horas da manhã e as seis horas da tarde. Existem várias formas de fazer, e uma delas seria essa:
Complicou? O jeito mais fácil de aprender é ir praticando. Se não abriu o site indicado para fazer os testes, abra agora, digite a lista que passei no exemplo e coloque a expressão regular lá.
Agora faça uma expressão regular que encontre todos os usuários que acessaram o sistema entre zero horas e nove horas. Como ficaria?
- Mas peraí! Eu fiz diferente.
É, eu sei. Você não usou o caracter ^ no inicio da expressão. Esse caracter quer dizer que o padrão procurado está no inicio de uma linha. Veja que omiti dessa vez o “sinal de dois pontos” da expressão, pois sei que, nesse caso, sempre que houver dois números no inicio da linha, existe uma hora. Os demais termos dessa expressão seguiram a lógica da expressão regular que mostrei anteriormente. Outra coisa diferente é o sinal de mais (+) logo depois do ponto. Repare que o ponto sempre está acompanhado. Nesse caso o sinal de + impõe uma condição: tem que existir o terceiro caracter para que o texto procurado “case” com o padrão. Dessa forma o texto 00:01 casaria, mas o texto 00 não.
Podemos deixar a expressão mais precisa ainda incrementando a expressão regular para checar se o restante do texto é uma hora completa ou não. Veja como ficaria:
Dessa vez não vou explicar detalhadamente, pois os conceitos envolvidos nessa expressão foram os que ja vimos nos últimos exemplos.
Agora que você já tem algum conhecimento e prática de criação e uso de expressões regulares, utilize o site indicado ou outra ferramenta de seu gosto, e pratique com outras variações de textos e expressões, pois somente assim é que vai incorporar definitivamente o que acabou de aprender aqui. Conforme alertei no início do artigo, não foi minha intenção esgotar o assunto, mas, se esse artigo serviu para desmistificar alguns tabus que você tinha sobre regex, e de quebra já fez com que você conseguisse aplicar algo em seu dia-a-dia, então posso dizer que o objetivo foi alcançado. Em breve publicarei a segunda parte e avançaremos um pouco mais com expressões mais complexas para localizar tags em arquivos HTML e muito mais. Dicas e críticas são bem vindas.
abril 10th, 2008 at 11:00 am
Douglas, ótima iniciativa de escrever um artigo sobre expressão regular. Eu últimamente tenho pensado em criar uma ferramente que a partir de uma expressão regular crie um código fonte, baseado nos conceito de máquina de estado que já apresentei em meu blog. O que acha da idéia?
abril 10th, 2008 at 12:00 pm
Genial a ideia. Tem algum rabisco pronto sobre isso ou só idéia mesmo?
abril 10th, 2008 at 2:51 pm
Por enquanto é só a idéia mesmo… Tenho olhado um pouco do código do TRegExpr para entender como é feito o Parse, acredito que posso pegar a parte do Parse e do resultado escrever o fonte objetivo.
abril 14th, 2008 at 3:09 am
[...] segunda parte do mini-curso de expressões regulares, irei apresentar algumas expressões que podem ser usadas para validar emails. Entre as [...]
abril 22nd, 2008 at 3:45 am
[...] primeira parte do curso nós vimos algumas funções para arquivos de log (veja a primeira parte do mini-curso de expressões regulares) e, na segunda, aprendemos como é fácil validar um email com regex, de várias formas, [...]
outubro 3rd, 2008 at 4:25 pm
Também gostei da idéia… Expressões regulares sempre me dão dor de cabeça! Valeu!