expressão regular ano escolar

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

ja bomba mas gostava que so aceita-se anos a partir de 1950, quer de um lado quer do outro
Código:
(/^(19[5-9]\d|2\d{3})\/(19[5-9]\d|2\d{3})$/g)
 
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
 
Back
Topo