Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks,

Can anyone tell me why this regex doesn't work:

#!/perl/bin/perl.exe -w $date = "20021122"; ($year, $month, $day) = $date =~ m/({.4})({.2})(.*)$/; print "YEAR $year\n"; print "MONTH $month\n"; print "DAY $day\n";
Thanks

Replies are listed 'Best First'.
Re: RegEx problem
by thelenm (Vicar) on Nov 22, 2002 at 22:25 UTC
    The dots should be before the curly braces, not inside them, because the curly braces modify the number of times a dot must match. So the regex might instead be:
    ($year, $month, $day) = $date =~ m/(.{4})(.{2})(.*)$/;

    -- Mike

    --
    just,my${.02}

Re: RegEx problem
by Popcorn Dave (Abbot) on Nov 23, 2002 at 05:28 UTC
    I think what you may have been after is:

    #!/perl/bin/perl.exe -w $date = "20021122"; ($year, $month, $day) = $date =~ m/(\d{4})(\d{2})(\d{2})/; print "YEAR $year\n"; print "MONTH $month\n"; print "DAY $day\n";

    This will get out the information you want. However I don't quite follow why you have the $ at the end to anchor your string if you've only got that info in there. The regex I've given you will fail if you have non digits in the string, so you should be okay. If you just slurp the rest of the string in to your match, you may or may not get numbers depending on what your data looks like.

    Hope that helps!

    There is no emoticon for what I'm feeling now.

Re: RegEx problem
by pg (Canon) on Nov 22, 2002 at 22:38 UTC
    Try out the attached example, first. When I say (.{4}), Perl takes it as: to match 4 of any characters (except newlines), and store in $1. When you said ({.4}), Perl took it as: literally match {.4}, and store in $1.

    Another thing is, you regexp is a little bit loose, in this case, better to use \d instead of '.'. Think about this, what if the date being passed in is malformatted?
    {$str = "1234{.4}"; $str =~ m/(.{4})/; print $1, "\n";#print 1234 $str =~ m/({.4})/; print $1, "\n";#print {.4}