[Moscow.pm] Date Validate
Vladimir V. Perepelitsa
inthrax на gmail.com
Чт Фев 28 02:47:01 PST 2008
Есть задачка по написанию регулярного выражения для проверки даты.
Постепенно \d{4}-\d{2}-\d{2} при помощи канала #Perl трансформировалось в
нижеследующее. Представлено в развернутом формате (/x) для удобства
доработки.
Присоединяйтесь, кто хочет к написанию тестовых вариантов и может быть
какой-то оптимизации.
Ограничение такое, что регулярное выражение должно также выполняться в
ECMAScript, т.е. использовать perl code-blocks не есть гуд :)
============
#!/usr/bin/perl
use strict;
use Test::More qw(no_plan);
my $test = qr{^
(
([02468][048]|[13579][26])([02468][048]|[13579][26])
-
(
(0[13578]|1[02])
-
([012]\d|3[01])
|
(0[469]|11)
-
([012]\d|30)
|
02-[012]\d
)
|
(
\d\d([02468][^048]|[13579][^26])
|
([02468][^048]|[13579][^26]00)
)
-
(
(0[13578]|1[02])
-
([012]\d|3[01])
|
(0[469]|11)
-
([012]\d|30)
|
02
-
([01]\d|2[0-8])
)
)
$}x;
like ($_,$test,$_) for
qw( 1900-02-28 2000-02-28 ),
( map { "2001-$_" } '02-28',
( map { "$_-31" } qw(01 03 05 07 08 10 12) ),
( map { "$_-30"} qw(04 06 09 11) ) ),
( map { "2000-$_" } '02-29',
( map { "$_-31" } qw(01 03 05 07 08 10 12) ),
( map { "$_-30"} qw(04 06 09 11) ) ),
;
unlike ($_,$test,$_) for
qw( 123-01-01 0000-00-00 ),
qw( 1900-02-29 2001-02-29 1900-02-30 2000-02-30 2001-02-30 2001-01-32),
;
--
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956
Подробная информация о списке рассылки Moscow-pm