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

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

Re: [shell-script] RegExp - Parte 2 (validando datas, com ano bissexto)


From: Humberto Pereira
Subject: Re: [shell-script] RegExp - Parte 2 (validando datas, com ano bissexto)
Date: Tue, 24 Jan 2006 15:35:48 -0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050923 Debian/1.7.12-0ubuntu05.04

Opa hardcorepunkfx,

        bem legal que vc esteja aprendendo expressoes regulares cara. Sao muito
uteis, alem de divertidissimas.

        Entao, ae vai uma dica. Eh possivel voce "enxugar" bastante sua
expressao. Por ex., na parte onde testa se o ano eh bissexto (bem legal
sua ideia):

        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])

Voce pode escrever ela apenas com:

        (19|2[01])([02468][048]|[13579][26])

Existem outros pedacos dela onde voce pode fazer o mesmo, fica ae como
exercicio. Boa aprendizagem e fico torcendo p/ q logo voce seja um dos
participantes + ativos da lista

[]s
Humberto Pereira


hardcorepunkfx wrote:
>  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]