
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]|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:
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.
Postar um comentário