Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

need regular expression

by jesuashok (Curate)
on Nov 02, 2005 at 07:25 UTC ( #504847=perlquestion: print w/ replies, xml ) Need Help??
jesuashok has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I need a regular expression that has to bring me the following answer.
If the date entered as '4-10-31' then change it to 2004-10-31.
If the year entered as '14-11-31' then change it to 2014-11-31
It can be done in many ways. But I need it to be done using single regular experssion.
Becasue Perl can do that

"Keep pouring your ideas"

Comment on need regular expression
Re: need regular expression
by saintmike (Vicar) on Nov 02, 2005 at 07:37 UTC
    for(qw(4-10-31 14-11-31)) { /(\d+)(-.*)/ && printf "%d%s\n", 2000+$1, $2; }
    Note that this obviously doesn't work for pre-2000 dates like 94-10-31.
Re: need regular expression
by tilly (Archbishop) on Nov 02, 2005 at 08:08 UTC
    Untested. s/(\d?\d)(-\d?\d-\d?\d)/(2000+$1).$2/eg

      That one won't promote single-digit numbers to double-digit numbers.

      s/(\d?\d)(-\d?\d)-(\d?\d)/(2000+$1).sprintf("%02g", $2).sprintf("%02g" +,$3)/eg

      could do it, but that's similarly untested :-)

        The listed examples didn't indicate to me that we need to worry about anything other than the first number, and adding 2000 to a 1 digit number definitely results in a 4 digit one. :-)

        But if that's your spec, then try s/(\d?\d)-(\d?\d)-(\d?\d)/sprintf("20%02d-%02d-%02d", $1, $2, $3)/eg

Re: need regular expression
by ioannis (Priest) on Nov 02, 2005 at 08:23 UTC
    for ( my @dates = qw( 4-10-31 14-11-31 ) ) { s/ ^ (\d) (\d)? (-\d{1,2}-\d{1,2}) $ /($2?"20$1":"200").$1.$+/ex and print; }
      This formula is simpler than the one earlier. The main insight here is to avoid strings; it is better to use arithmetic addition to construct the 'year' string (i.e. 20xx) .
      for ( my @dates = qw( 4-10-31 14-11-31 ) ) { s/ ^ (\d{1,2}) ((?:-\d{1,2}){2}) $ /(2000+$1).$+/xe and print; }
        I prefer to use strings - in that case, it becomes easy to deal with 3 or 4 digit years as well:
        my @dates = qw /4-10-31 14-11-31 1979-10-10/; for (@dates) { s/(\d+)/substr("2000", 0, -length($1)).$1/e; print "$_\n"; } __END__ 2004-10-31 2014-11-31 1979-10-10
        Perl --((8:>*
Re: need regular expression
by davido (Archbishop) on Nov 02, 2005 at 08:46 UTC

    The following will work correctly if the year is specified as 0, 1, 11, 111, or even 1111 (ones representing any digit):

    use strict; use warnings; my( @dates ) = ( '4-10-31', '14-11-31' ); foreach my $date ( @dates ) { my $string = $date; $string =~ s/^(\d+)/ my $year=2000; substr($year,4-length($1),length($1))=$1; $year/e; print $string, "\n"; }

    You can even override '2000' as being the base year by including the entire four-digit year, as in "1987-10-31".


    Dave

Re: need regular expression
by l.frankline (Hermit) on Nov 02, 2005 at 09:06 UTC
    Hi,

    Try this...

    $_='4-10-31';

    print $_ if (s/(\d{1,2})(\-\d{1,2}\-\d{1,2})/"2". 0 x (4 - length($1)+1-2).$1.$2/e);

    frank.
Re: need regular expression
by samizdat (Vicar) on Nov 02, 2005 at 13:42 UTC
    But I need it to be done using single regular expression.

    Smells like homework to me... jesuashok, 'fess up?
      I agree. In the "Real World", you probably would want to use a module like DateTime to do this sort of thing.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://504847]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (14)
As of 2014-09-30 15:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (376 votes), past polls