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 ano escolar

Discussão em 'Web Development' iniciada por alfinete, 6 de Junho de 2008. (Respostas: 11; Visualizações: 1029)

  1. alfinete

    alfinete Power Member

    Código:
    "^\d{4}/\d{4}$"
    
    tenho esta expressão regular para validar

    4digitos/4 digitos ex: 2345/0000

    no qual funciona na perfeição

    gostava que me ajudassem a fazer uma alteração

    em qualquer sequencia de 4 o 1 e 2 digitos tem de ser no minimo 1,9
    se o primeiro for 2 os restantes podem ser um qualquer
    e a segunda sequancia de digitos tem de ser um ano superior a primeira


    ex:

    1200/1200 -- falso
    1900/1900 -- falso
    1901/1900 -- falso
    1900/1901 -- verdade
    2000/2001--verdade
    2001/2000--falso




    agradecia um help
     
  2. Martinho

    Martinho Power Member

    usa capture groups e verifica os valores.
     
  3. alfinete

    alfinete Power Member

    eu não percebo muito de expressions fasso mesmo o minimo.

    por isso pedi este help

    se sabes fazer agradecia imenso
     
  4. slack_guy

    slack_guy Power Member

    Aqui vai:
    Código:
    #!/usr/bin/perl 
    # ficheiro: regex.pl
    use strict;
    use warnings;
    my @strings = (
        q|1200/1200|, q|1200/1201|, q|1900/1900|, q|1901/1900|,
        q|1900/1901|, q|2000/2001|, q|2001/2000|,
    );
    
    foreach (@strings) {
    
        if (
            /^
            (                 # 1º grupo de 4 digitos
                [1-9]{2}\d{2} # 4 digitos: os dois primeiros tem de ser 1-9
                |             # ou
                2\d{3}        # 4 digitos: onde o primeiro e' 2; os restantes sao indiferentes
            )
            \/                # separados por uma barra
            (                 # 2º grupo de 4 digitos
                [1-9]{2}\d{2} # 4 digitos: os dois primeiros tem de ser 1-9
                |             # ou
                2\d{3}        # 4 digitos: onde o primeiro e' 2; os restantes sao indiferentes
            )
            $/gmx
            && $1 < $2
          )
        {
            print qq|$_ : verdadeiro\n|;
        }
        else {
            print qq|$_ : falso\n|;
        }
    }
    
    
    Resultado:
    Código:
    $ perl regex.pl
    1200/1200 : falso
    1200/1201 : verdadeiro
    1900/1900 : falso
    1901/1900 : falso
    1900/1901 : verdadeiro
    2000/2001 : verdadeiro
    2001/2000 : falso
    
    EDIT:
    A expressão regular é esta:
    Código:
    /^([1-9]{2}\d{2}|2\d{3})\/([1-9]{2}\d{2}|2\d{3})$/gmx
    
     
    Última edição: 6 de Junho de 2008
  5. alfinete

    alfinete Power Member

    sim ok ,as a data minima que aceita é 1900

    agradecia
    o 1200/1200 esta a por true e deve ser false mesmo que aceitasse 1200

    Código:
    ^([1,9]{2}\d{2}|2\d{3})\/([1,9]{2}\d{2}|2\d{3})$
    assim como esta os dois primeiros so aceita ou 1 ou 9, so que a 2ª sequencia tem de ser uma ano superior ao 1º

    não ha uma forma de fazer isso sem ser esta ultima parte sem o gmx

    é que eu estou em studio c#


    onde fasso assim

    Código:
    
         private bool validaanoescolar(string str)
                     {
    
                       Regex Data = new Regex(@"^([1,9]{2}\d{2}|2\d{3})\/([1,9]{2}\d{2}|2\d{3})$");
                     // Regex Data = new Regex(@"^\d{4}/\d{4}$");
                      
                     return Data.IsMatch(str);
                       
                     }
    
    agradecia um help
     
    Última edição: 6 de Junho de 2008
  6. slack_guy

    slack_guy Power Member

    Porque é que não disseste isso mais cedo?

    Código:
    /^(19\d{2}|2\d{3})\/(19\d{2}|2\d{3})$/g
     
    Última edição: 6 de Junho de 2008
  7. alfinete

    alfinete Power Member

    não bomba
     
  8. slack_guy

    slack_guy Power Member

    o que é que não bomba?
    Não estarás a esquecer-te do pormenor && $1 < $2
     
  9. anjo2

    anjo2 Power Member

    A tua solução não funciona para datas a partir de 2000, só 19xx, sendo que 1999/2000 também será uma data válida.
     
  10. alfinete

    alfinete Power Member

    ja bomba mas gostava que so aceita-se anos a partir de 1950, quer de um lado quer do outro
     
  11. slack_guy

    slack_guy Power Member

    Sim, a minha solução original não contemplava isso.
    O update
    Código:
    (/^(19\d{2}|2\d{3})\/(19\d{2}|2\d{3})$/g)
    não tem esse problema.

    Código:
    (/^(19[5-9]\d|2\d{3})\/(19[5-9]\d|2\d{3})$/g)
    
     
  12. alfinete

    alfinete Power Member

    thanks ,parece que esta ultima bomba perfeitamente

    mas em c# fica


    Código:
     Regex Data = new Regex(@"^(19[5-9]\d|2\d{3})\/(19[5-9]\d|2\d{3})$");
    depois quanto ao maior e menor que outra fiz ums metodos que fazem isso

    mas muito brigada na mesma
     

Partilhar esta Página