Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Reg expression on day

by Anonymous Monk
on Dec 23, 2003 at 16:49 UTC ( [id://316653]=perlquestion: print w/replies, xml ) Need Help??

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

I need to substitute a date entry if the day has a "0" as the beginning. For example if I find this entry: 12/09/2003 I need it to be: 12/9/2003 Please advise:
s/^\d{2}\/(0)\d\/\d{4}//g;

Replies are listed 'Best First'.
Re: Reg expression on day
by Thelonius (Priest) on Dec 23, 2003 at 16:59 UTC
    That would delete the date entirely. Here's one that would work:
    s!^(\d+/)0(\d/\d{4})!$1$2!;
      Thank you!
Re: Reg expression on day
by Roy Johnson (Monsignor) on Dec 23, 2003 at 17:19 UTC
    s!/0!/!

    Update:
    To remove all leading zeroes (day, month, and year):
    s/\b0//g


    The PerlMonk tr/// Advocate
Re: Reg expression on day
by flounder99 (Friar) on Dec 23, 2003 at 17:59 UTC
    If you only want to get rid of the leading zero on the day this would work:
    s!/0?(\d+)/!/$1/!
    If you want to get rid of the leading zeros on both the month and the day this would work:
    s!0?(\d+)/0?(\d+)!$1/$2!
    use strict; for ('12/09/2003', '12/10/2003', '01/01/2004') { my $date = $_; print "Before: $date\n"; $date =~ s!/0?(\d+)/!/$1/!; print "Leading zero off of day: $date\n"; $date = $_; $date =~ s!0?(\d+)/0?(\d+)!$1/$2!; print "Leading zero off of month and day: $date\n\n"; } __END__ Before: 12/09/2003 Leading zero off of day: 12/9/2003 Leading zero off of month and day: 12/9/2003 Before: 12/10/2003 Leading zero off of day: 12/10/2003 Leading zero off of month and day: 12/10/2003 Before: 01/01/2004 Leading zero off of day: 01/1/2004 Leading zero off of month and day: 1/1/2004

    --

    flounder

      you can replace
      $date =~ s!0?(\d+)/0?(\d+)!$1/$2!;
      with
      $date =~ s!0?(\d+/)!$1!g;
      for month and day.
Re: Reg expression on day
by Paulster2 (Priest) on Dec 23, 2003 at 17:55 UTC

    An alternate way of doing this might be to break out your MM/DD/YYYY into seperate chunks (ie $MM = month, $DD = day, and $YYYY = year), then take the day variable and add zero to it. Then put it all back together again. This way you could manipulate the date if you needed to.

    ($MM, $DD, $YYYY) = split(/,"$date"); $MM=$MM+0; $DD=$DD+0; $date=$MM."/".$DD."/".$YYYY;

    Please forgive me if my split syntax is incorrect. I don't have an example in front of me. Anyway, I am just providing an alternate methodry. Although if you absolutely need to use a regex or want to get better at using them, this definitely won't help you!

    Have fun!

    UPDATE: Thanks flounder99 for the correction, I thought that I was missing something!

    Paulster2

      Please forgive me if my split syntax is incorrect

      All you need is to quote your slash:

      split('/',"$date")
      I was thinking of something similar:
      s!(\d+)/(\d+)!($1+0).'/'.($2+0)!e

      --

      flounder

      Sure, and it cleans up a bit:

      $date = join "/", map $_+0, split m[/], $date;

      Not sure if I like the idea of stripping those zeroes though. Probably better to store the date in a saner format (Epoch seconds maybe?), then use POSIX::strftime() to generate the desired date format.
Re: Reg expression on day
by jbware (Chaplain) on Dec 23, 2003 at 18:40 UTC
    Here's another way to do it, and it works for leading zeros on month and day.
    s|0(\d)/|$1/|g;
      Or more simply: s!\b0!!g.

      The PerlMonk tr/// Advocate
      Again, thanks for all the input!
Re: Reg expression on day
by Art_XIV (Hermit) on Dec 23, 2003 at 20:57 UTC

    Here's a way that makes gratuitous use of map! ;)

    use strict; while (<DATA>) { chomp; my $val = join '/', map {$_ + 0} (split /\//, $_); print "$val\n"; } __DATA__ 12/09/2004 01/15/2003 03/09/2004 10/28/2002 004/00003/02003

    Isn't Perl wonderful?

    Hanlon's Razor - "Never attribute to malice that which can be adequately explained by stupidity"
Re: Reg expression on day
by delirium (Chaplain) on Dec 24, 2003 at 13:21 UTC
    Since this is already getting out of hand....

    substr($_,3,2) += 0;

    This will work only if the month always has two digits.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (5)
As of 2024-04-25 16:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found