in reply to date format string -> Reg Ex solution
use strict; sub prepareFormat { my $format = shift(); my ($i, @order) = 0; $format =~ s/([YMDhms]+)(\?)?/ $order[$i++] = substr($1,0,1); '('. +('\d' x length($1))."$2)"/ge; $format = qr/^(?:$format)$/; return [$format, \@order]; } sub parseDate { my ($format, $date) = @_; my @data = ($date =~ $format->[0]) or return; my %result; for(my $i = 0; $i <= $#data; $i++) { $result{$format->[1]->[$i]} ||= $data[$i]; } return map $result{$_}, qw(Y M D h m s); } #my $format = prepareFormat ('YYYY/MM/DD'); #my $format = prepareFormat ('YYYY-DD-MM|YYYY-DD-M|YYYY-D-MM|YYYY-D-M' +); #my $format = prepareFormat ('YYYY-DD?-MM?'); #my $format = prepareFormat ('YYYY-DD?-MM? hh?:mm?'); #my $format = prepareFormat ('YYYY-DD?-MM? hh?:mm?(?::ss?)?'); my $format = prepareFormat ('YYYY-DD?-MM?(?: hh?:mm?(?::ss?)?)?'); while (<>) { chomp; my ($year, $month, $day, $hour, $min, $sec) = parseDate($format, $ +_) or print "\tNot in the right format!\n" and next; print "Year: $year, Month: $month, Day: $day, Hour: $hour, Min: $m +in, Sec: $sec\n"; }
The prepareFormat() returns a reference to an array containing the regexp and the mapping between the capturing parenthesis and the parts of the date, the parseDate() uses this structure to match the date and extract the data. It then returns (year,month,day,hour,min,sec).
As you can see from the examples you may accept&parse several different datetime formats at once.
Jenda
Always code as if the guy who ends up maintaining your code
will be a violent psychopath who knows where you live.
-- Rick Osborne
Edit by castaway: Closed small tag in signature
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: date format string -> Reg Ex solution
by markjugg (Curate) on Apr 23, 2003 at 19:06 UTC | |
by Jenda (Abbot) on Apr 23, 2003 at 20:44 UTC |