[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- RES: [shell-script] RegExp - Parte 2 (validando datas, com ano bi ssexto),
Julio Cezar Neves - DATAPREVRJ <=