expressão regular

alfinete

Power Member
agradecia que alguem que tivesse uma expressão regular que fize-se:

deterctar anos bisextos

dias do mês (31,30)dias

validação de datas nos formato dd-mm-yyyy

agradecia imenso

obrigado
 
Não me quer parececer que seja tudo feito com expressões regulares.
deterctar anos bisextos > o mês de Fevereiro tem quantos dias?
dias do mês (31,30)dias > Quantos dias tem o corrente mês?

validação de datas nos formato dd-mm-yyyy:

/\d\d-\d\d-\d\d\d\d/ Apenas se vai certificar que não há letras na data, que está tudo separado por tracinhos, e que o dia e o mês têm 2 números ficando o ano com 4 números.

Não se certifica que o dia é menor que 31 ou que o mês é menor que 12.

Terias que dividir dia,mês e ano e analisar separadamente.
 
Última edição:
O dia do mês pode-se fazer por exemplo com um array de 12 posições em k o indice da posição do array tem o numero de dias que o mês tem.

Para os anos bissextos ... tens por exemplo uma ajuda aqui ...
http://pt.wikipedia.org/wiki/Ano_bissexto

São portanto bissextos:
Os múltiplos de 4 e não múltiplos de 100: 1996, 2004, 2008 e 2012
Os múltiplos de 400: 1600, 2000, 2400
Não são bissextos:
Os múltiplos de 100 e não de 400: 1700, 1800, 1900 e 2100
 
agradecia que alguem que tivesse uma expressão regular que fize-se:
deterctar anos bisextos
dias do mês (31,30)dias
validação de datas nos formato dd-mm-yyyy

Aqui está (em Perl, claro):
Código:
#!/usr/bin/perl
# ficheiro: regex_datas.pl
use strict;
use warnings;

#
# para este exercício só aceito datas entre 1900 e 2099
# utilizei o formato dd-mm-aaaa
#

my @datas = (
    '1-3-2007',                      # OK
    '29-2-2008',                     # OK, ano bissexto
    '29-2-2000',                     # OK, ano bissexto
    '25-9-2008',                     # OK
    '31-3-2008',                     # OK
    '31-4-1999',                     # NOT OK, dia invalido
    '26-10-1899',                    # NOT OK, ano < 1900
    '26-13-1505',                    # NOT OK, mes invalido e ano < 1900
    '36-10-2011',                    # NOT OK, dia invalido
    '26-13-2001',                    # NOT OK, mes invalido
    '30-2-1980',                     # NOT OK, dia invalido
    '0-2-1980',                      # NOT OK, dia invalido
    '29-2-1900',                     # NOT OK, ano nao bissexto
    '12-("&$%"(%"/("%$("&$##/("#'    # NOT OK!
);

foreach my $data (@datas) {

    print $data, $data =~ m+^
        (0?[1-9]|[12][0-9]|3[01])
        [- /.]
        (0?[1-9]|1[012])
        [- /.]
        (19|20)\d\d
        (??{$1 == 31 and (
            $2 == 4 or $2 == 6 or $2 == 9 or $2 == 11
        )})
        (??{$1 >= 30 and $2 == 2})
        (??{$2 == 2 and $1 == 29 and not 
            ($3 % 4 == 0 and
                ($3 % 100 != 0 or $3 % 400 == 0)
        )})
    $+gx ? qq|\tCERTO!\n| : qq|\tERRADO!\n|;

}

E o resultado, como esperado:
Código:
[me@mybox] ~/Perl: perl regex_datas.pl
1-3-2007        CERTO!
29-2-2008       CERTO!
29-2-2000       CERTO!
25-9-2008       CERTO!
31-3-2008       CERTO!
31-4-1999       ERRADO!
26-10-1899      ERRADO!
26-13-1505      ERRADO!
36-10-2011      ERRADO!
26-13-2001      ERRADO!
30-2-1980       ERRADO!
0-2-1980        ERRADO!
29-2-1900       ERRADO!
12-("&$%"(%"/("%$("&$##/("#     ERRADO!

Nota 1: Isto é uma expressão regular 'levada da breca' :-) Nem sei se consegues construir esta expressão noutra linguagem que não o Perl.

Nota 2: Só testei com as datas que estão no exemplo. É bem possível que falhe na validação de outras.

Nota 3: Isto foi feito 'em cima do joelho' e não garanto que seja 100% fiável.
 
Ok, como não percebi se era para um trabalho ou apenas para uso, fica aqui o exemplo em PHP:

Código:
$data = '25/2/2007';


//Validar data na variavel $data
if( ($dateTime = strtotime( $data )) == -1 )
    echo 'Data incorrecta! :(';
else
    echo 'Data certissima! :)';


//O ano na dita data é bissexto?
if( date( 'L', $dateTime ) == 1 )
    echo 'Ano bissexto!';
else
    echo 'Ano não é bissexto!';


//Quantos dias tem o mês na dita data?
echo 'O mês tem ' . date( 't', $dateTime ) . ' dias!';

Usam-se as funções strtotime e date.
Assim nem é preciso pensar muito :sad:
 
@CrazyBomber:
O que o 'alfinete' pediu explicitamente foi uma expressão regular. O código que colocaste não responde à questão original.
Não sei se já conheces este site. Está cheio de exemplos de "profissionais" que fazem as funções mais complicadas "à mão", entre as quais: fazer parse e validar datas, obter ou dividir "partes" de uma string (dados dois indices), validar inteiros (string->int), copiar um ficheiro, remover ou substituir caracteres de uma string, etc etc.

Eu perguntei, logo no 3º post da thread, qual era o objectivo deste código. Se fosse para um trabalho académico, tudo bem. Mas como ele não respondeu, decidi deixar a minha sugestão de qualquer maneira. Não magoei ninguém, pois não? :)
 
Não magoei ninguém, pois não?
A mim não.

Eu perguntei, logo no 3º post da thread, qual era o objectivo deste código.
Eu percebo-te. Porém, a questão aqui não é a da finalidade do código; o 'alfinete' não perguntou qual a melhor forma para fazer isto, ou se uma expressão regular seria adequada para a finalidade, ou etc e tal.

Eu parto sempre do princípio que cada um sabe de si: se o 'alfinete' quer uma expressão regular lá há-de ter as suas razões que não intreressam para o caso (ele não pediu opinião sobre as suas razões ;-) ).
Qualquer linguagem de programação séria tem funções apropriadas para lidar com datas; fazer este 'malabarismo' com expressões regulares é que não é para qualquer uma.
 
Back
Topo