1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

expressão regular

Discussão em 'Web Development' iniciada por alfinete, 3 de Dezembro de 2007. (Respostas: 8; Visualizações: 1738)

  1. alfinete

    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
     
  2. K0mA

    K0mA Power Member

    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: 3 de Dezembro de 2007
  3. CrazyBomber

    CrazyBomber Power Member

    Isto é algum trabalho? É que acho que PHP e ASP devem ter já funções para isso ( date() no php, dá para isso tudo de certeza)...
     
  4. saunde

    saunde Power Member

    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

     
  5. slack_guy

    slack_guy Power Member

    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:
    [[email protected]] ~/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.
     
  6. CrazyBomber

    CrazyBomber Power Member

    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:
     
  7. slack_guy

    slack_guy Power Member

    @CrazyBomber:
    O que o 'alfinete' pediu explicitamente foi uma expressão regular. O código que colocaste não responde à questão original.
     
  8. CrazyBomber

    CrazyBomber Power Member

    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? :)
     
  9. slack_guy

    slack_guy Power Member

    A mim não.

    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.
     

Partilhar esta Página