shell-script-pt
[Top][All Lists]
Advanced

[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.






reply via email to

[Prev in Thread] Current Thread [Next in Thread]