[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RegExp - Parte 2 (validando datas, com ano bissexto)
From: |
hardcorepunkfx |
Subject: |
RegExp - Parte 2 (validando datas, com ano bissexto) |
Date: |
Tue, 24 Jan 2006 16:48:24 -0000 |
User-agent: |
eGroups-EW/0.82 |
Bem, mandei uma regexp pra lista (que validava IP), pois estava com
dúvidas sobre seu gigantesco tamanho (estava funcionando), já que era
apenas a décima que eu havia feito, e pensava ser a maior, maaaaaas
hoje /^24/01/06$/, fiz o que seria minha maior e mais complexa
criação, serve para validar (tinha que servir para alguma coisa né?!)
datas no formato ../../...., a fiz pois houve uma grande necessidade
onde trabalho, e queria fazer valer apena as 4 horas que havia gasto,
no horário de trabalho para ler o Livro do Aurélio, então, depois de
namorar por minutos a regexp do Aurélio para validar datas, percebi
que está era muito didática, mas não poderia ser usada pois não
casava com alguns casos (frase com bonita sonoridade), por exemplo;
31/4/.... (mês com apenas 30 dias)
31/2/.... (longo fevereiro)
29/2/2000 (deveria se importar com os anos bissextos)
Então caí matando em cima de implementações da construída pelo
Aurélio (espero que não me processe por ter usado a idéia, eu só quis
ajudar as pessoas que querem suar regexp em seus scripts, como
eu... :> ), olha como ficou a monstrinha;
/^(((0[1-9]|[1-9]|1[0-9]|2[0-8])/(2|02)/(1[9][0-9]{2}|2[01][09]{2}))|
((0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01])/(1|01|3|03|5|05|7|07|8|08|10|12)/
(1[9][0-9]{2}|2[01][09]{2}))|((0[1-9]|[1-9]|1[0-9]|2[0-9]|30)/([469]
|11)/(1[9][0-9]{2}|2[01][09]{2}))|(29/2/(19(0[048]|1[26]|2[048]|3[26]
|4[048]|5[26]|6[048]|7[26]|8[048]|9[026])|2[01](0[048]|1[26]|2[048]|3
[26]|4[048]|5[26]|6[048]|7[26]|8[048]|9[026]))))$/
Não precisam ter medo, nem preguiça para utilizá-la, vou como forma
de contribuir com a lista (e não só ficar pedindo que resolvam meus
problemas pessoais ou computacionais, coisa que inclusive já ajudaram
bastante com tantso bons livros - ShellScript (Julio Neves),
Expressões Regulares (Aurélio Marinho)) vou descrever como foi
construída.
Parte 1 (Anos passados e futuros)
1[9][0-9]{2} - Um seguido de nove seguido de 0 ou, mais dois
dígitos que devem estar entre 0 até 9 (1900 áté 1999).
2[01][09]{2} - Dois, seguido de, ou zero, ou um, mais dois
digitos, cada um podendo estar entre zero até 9. (2000 até 2199)
Unindo as possibilidades permitidas;
( (1[9][0-9]{2}) | 2[01][09]{2} ) que resulta na faixa (1900 até
2199)
Parte 2 (dias dependem de meses)
não posso fazer meses separados de dias, bem até poderia, mas
dificultaria um pouco (semi-impossível) eu referenciar esses meses
para condicionar meus dias, por exemplo, em abril não temos 31 dias,
no mês de fevereiro não temos mais de 28 dias (até teríamos caso o
ano fosse bissexto, mas deixe isso pra mais tarde), então ficou assim;
F E V E R E I R O
([1-9]|1[0-9]|2[0-8])/2/* (esses são todos os dias que fevereiro
aceita, de 01 ou 1 até 28).
MESES COM 31 DIAS
([1-9]|[12][0-9]|3[01])/[13578]|10|12/* (meses que suportam de 01 ou
1 à 31 dias)
MESES COM 30 DIAS
([1-9]|[12][0-9]|30)/[469]11/* (meses que suportam de 01 ou 1 à 30
dias)
Parte 3 (O maldito ano bissexto)
Bem, e o ano bissexto um cara querendo me complicar pergunta! eu
respondo, como se calcula o ano bissexto? daí o cara dá uma relaxada,
essa é minha dica, sempre complique quem quer complicá-lo, mas no fim
resolva o problema!
A Definição Científica Cronológica Lógica Matemática do paradigma
sobre Anos bissextos é a seguinte;
"Em anos múltiplos de 4, que não sejam divisíveis por 100, mas que
incluam os divisíveis por 400, acrescente um dia a fevereiro."
Bem, Como poderei multiplicar ou dividir em Expressões Regulares?,
e como farei isso de "SE tal, SENÃO aquilo FAÇA isso", isso não
existe em Expressões Regulares, bem, eu acho que não né (Socorro
Aurélio!!!), isso´são recursos de liguagens de programação,
Expressões Regulares trabalham com resultados, com strings, possuem
máquina de busca, comparação ou substituição somente, então temos de
criar uma tabela dos possíveis resultados e tentar criar uma espécie
de "teste de mesa", ou de tabela (me lembrou antigos RPGs com
gigantescas tabelas de possibilidades...saudade da infância) a minha
ficou assim;
00
04
08
12
16
20
24
28.. e por aí vai...
Notaram alguma possibilidade de semelhança? eu sim, veja;
00 -+
04 | ->0[048]
08 -+
12 -+
16 -+ ->1[26]
20 -+
24 | ->2[048]
28 -+
Então, segundo a minha lógica (já patenteei, nem tentem!) ficou
assim o assado (valorizo a sonoridade);
2[01](0[048]|1[26]|2[048]|3[26]|4[048]|5[26]|6[048]|7[26]|8[048]|9
[026])
O que significa?
vou explicar, essa parte recortada compreende de 2000 até 2199, e
casa com os casos (0[048]|1[26]|2[048]|3[26]|4[048]|5[26]|6[048]|7[26]
|8[048]|9[026])
Mas...tem certeza que está certo, e sobre o tal "divisível por 400"?
Sim, tenho certeza que está certo, sobre o "também acrescente aos
divisível por 400, mesmo que sejam também por 100, contrariando assim
a segunda regra", o bug então existiria caso a faixa de valores fosse
maior, pegando esses malditos divisíveis por 400, mesmo que por 100,
veja os tais;
1200, 1600, 2000, 2400, 2800, ....
Como nossa faixa de valores anuais está compreendida entre 1900 e
2199 (acha que fiz de bobera?) então não preciso me preocupar com
essas exceções, pois a que está dentro da faixa é válida, e os outros
dois que regem a segunda regra não serão válidos (1900 e 2100).
A g R A^d e Cime t os
então é só pessoal, espero ter ajudado alguém com estas palavras sem
sentido, e meu parabéns para o Aurélio pelo excelente material que
serve não só para estudo, como também como fonte de motivação, para o
Julio Neves por sua paciência (inexplicável) ao ajudar a nós,
aventureiros do SHELL, e pra niguém sentir inveja, um parabéns a
todos por serem esforçados e virem buscar informação nesta ótima
lista!
- A T E N Ç Ã O -
Atenção impacientes e intolerantes a erros, coloquei espaços em
algumas regexp para facilitar a leitura da mesma, retirem todos os
espaços que houverem quando forem utilizá-las.
- RegExp - Parte 2 (validando datas, com ano bissexto),
hardcorepunkfx <=