sexta-feira, 16 de maio de 2008

Biblioteca de Expressões Regulares[Regex Library]

Trabalhando com Expressões Regulares

Os modelos de programação modernos tem se preocupado principalmente com princípios de alto-nível como robustez, flexibilidade, boa arquitetura e um projeto composto de módulos com baixo acoplamento e alta coesão. E eu estou de total acordo com eles, são esses princípios que sustentam grandes softwares, principalmente aqueles que necessitam de constante alteração (isto é, 99%* deles :-))

Porém existem cenários em que habilidades que antes eram extremamente comuns para os programadores vôvôs, de sistemas Unix e tal, e que para nós, engenheiros de software, não são tão intuitivas, se tornam a chave para uma boa solução. Um exemplo disso são as Expressões Regulares, cujo cenário em que dominam é o reconhecimento de padrões em textos.

Por exemplo: Como fazer para verificar se uma string é uma data válida ? As duas opções que vejo são:

  • Um código cheio de IFs e extremamente confuso

  • Um expressão regular, não menos confusa que a opção anterior :-p


A grande vantagem da expressão regular é o desempenho, as bibliotecas que processam essas expressões são altamente eficientes, a classe Regex de .NET, por exemplo.

A grande dificuldade de expressões regulares é complexidade, veja por exemplo a expressão regular para validar data no formato dd/mm/aaaa:

(((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|
(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|
((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|
((29)(\.|-|\/)(02)([/])([02468][048]00))|
((29)([/])(02)([/])([13579][26]00))|((29)([/])(02)([/])([0-9][0-9][0][48]))|
((29)([/])(02)([/])([0-9][0-9][2468][048]))|
((29)([/])(02)([/])([0-9][0-9][13579][26])))

Simples né ??

Mas o interessante é que encontrei um site com centenas dessas expressões malucas: http://regexlib.com/

Com essa ferramenta (o site) você pode facilitar a grande dor de cabeça das expressões regulares, isto é, a confecção das mesmas, e então aproveitar do que elas tem de melhor: Eficiência!

Dica .NET

Para fazer a validação de data (dd/mm/aaaa) em .NET (C#) use o seguinte código:

bool regex(string data)

{


string expressao = @"(((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|

(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|


((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\.|-|\/)(02)([/])([02468][048]00))|


((29)([/])(02)([/])([13579][26]00))|


((29)([/])(02)([/])([0-9][0-9][0][48]))|


((29)([/])(02)([/])([0-9][0-9][2468][048]))|


((29)([/])(02)([/])([0-9][0-9][13579][26])))";


return Regex.IsMatch(data, expressao);

}


O recado é esse, se precisar de Expressões Regulares, prontinhas e esperando para serem usadas, acesse:



* Esses 99% foi um número inventado por mim mesmo, mas caso você pesquise verá que realmente se trata da grande maioria.

1 comentários:

Daniel disse...

Há vários sites igualmente úteis para quem quer se aventurar em criar suas próprias expressões regulares. Um bom site para aprender o básico é
http://guia-er.sourceforge.net

Para quem deseja testar suas ERs recomendo o site http://rexv.org . Possui um sistema de avaliação em AJAX, tem uma interface simples e é compatível com ERs usadas em PERCL e Javascript.

Vale lembrar que o uso dos sites é gratuito.