View Full Version : expressão regular
alfinete 03-12-2007, 21:35 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.
CrazyBomber 04-12-2007, 00:41 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)...
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
slack_guy 05-12-2007, 13:15 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):
#!/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:
[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.
CrazyBomber 05-12-2007, 15:10 Ok, como não percebi se era para um trabalho ou apenas para uso, fica aqui o exemplo em PHP:
$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 (http://pt.php.net/manual/pt_BR/function.strtotime.php) e date (http://pt.php.net/manual/pt_BR/function.date.php).
Assim nem é preciso pensar muito :sad:
slack_guy 05-12-2007, 15:59 @CrazyBomber:
O que o 'alfinete' pediu explicitamente foi uma expressão regular. O código que colocaste não responde à questão original.
CrazyBomber 05-12-2007, 17:52 @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 (http://worsethanfailure.com/) 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? :)
slack_guy 05-12-2007, 18:07 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.
|
|