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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RES: [shell-script] RegExp - Parte 2 (validando datas, com ano bi ssexto


From: Julio Cezar Neves - DATAPREVRJ
Subject: RES: [shell-script] RegExp - Parte 2 (validando datas, com ano bi ssexto)
Date: Tue, 24 Jan 2006 15:31:53 -0200

Olá hardcorepunkfx,
parabens a vc tb pela didática e persistência. Não é qq um que tem paciência
e perseverança para fazer testes, testes e mais testes até chegar a uma
expressão deste tamanho. 

Uma pequena contribuição: vc começa a crítica de todos os meses com
[1-9]|... Que tal fazer 0?[1-9]...? A que vc fez casa com 1 a 9. A que estou
sugerindo casa com 1 a 9 e com 01 a 09

Uma pequena dúvida: vc disse "me lembrou antigos RPGs com gigantescas
tabelas de possibilidades... saudade da infância". Nesta frase vc estava se
referindo a qual significado de RPG: RePort Generator ou Role Play Game?

[ ]s,
Julio Cezar Neves
Tel:+55 21 2555-6148 / +55 21 8112-9988
Fax: +55 21 2555-6154
http://www.julioneves.com


| -----Mensagem original-----
| De: hardcorepunkfx [mailto:address@hidden]
| Enviada em: terça-feira, 24 de janeiro de 2006 14:48
| Para: address@hidden
| Assunto: [shell-script] RegExp - Parte 2 (validando datas, com ano
| bissexto)
| 
| 
|  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.
| 
| 
| 
| 
| 
| 
| ---------------------------------------------------------------------
| Esta lista não admite a abordagem de outras liguagens de 
| programação, como perl, C etc. Quem insistir em não seguir 
| esta regra será moderado sem prévio aviso.
| ---------------------------------------------------------------------
| Sair da lista: address@hidden
| ---------------------------------------------------------------------
| Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil

 
Links do Yahoo! Grupos




 



reply via email to

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