[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