in reply to Re: perl equiv regex for C strtol
in thread perl equiv regex for C strtol

Thanks for the advice.
I have been writing code since 1968, actually the first few lines prior to that. I had a series back in the 70's in Kilobaud magazine, and spent 15 years in the Unix environment. I have used regular expressions, and even felt quite confident when it came to knowing how I was going to do something before I started. Unlike playing the piano, however I have had to re-learn how to use every time I stop for a few years.
Now I am 65, and am lucky I remember which side of the bed to get out of
I will however learn again, I just need a little help this evening.
As always, I have found it on PerlMonks!
Thanks Again - L.

br

Replies are listed 'Best First'.
Re^3: perl equiv regex for C strtol
by Anonymous Monk on May 01, 2012 at 06:36 UTC

    Hi

    Regexp::English

    #!/usr/bin/perl -- use Regexp::English; print Regexp::English ->new ->remember ->multiple ->digit, "\n"; __END__ (?^:((?:\d+)))

    Becomes

    my( @numbers ) = $str -~ m{ (\d+) }gx;
    /g means global match (match them all), x means ignore literal white space in pattern

    YAPE::Regex::Explain can explain a lot of these (though it could use some updating)

    use YAPE::Regex::Explain; print YAPE::Regex::Explain->new( qr{ (\d+) }x, )->explain; __END__ The regular expression: (?x-ims: (\d+) ) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?x-ims: group, but do not capture (disregarding whitespace and comments) (case-sensitive) (with ^ and $ matching normally) (with . not matching \n): ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

    See also Visual (perl/Tk) regex tweaking utility (its like a living cheatsheet). See also perlrequick

    And see Regexp::Common

    $ perl -MRegexp::Common -e " print $RE{num}{int} " (?:(?:[+-]?)(?:[0123456789]+))

    And the magic of /x revealed

    #!/usr/bin/perl -- use strict; use warnings; my $REint = qr{ #--------------------------------------------------------------------- +- (?: # group, but do not capture: #--------------------------------------------------------------------- +- (?: # group, but do not capture: #--------------------------------------------------------------------- +- [+-]? # any character of: '+', '-' (optional # (matching the most amount possible)) #--------------------------------------------------------------------- +- ) # end of grouping #--------------------------------------------------------------------- +- (?: # group, but do not capture: #--------------------------------------------------------------------- +- [0123456789]+ # any character of: '0', '1', '2', '3', # '4', '5', '6', '7', '8', '9' (1 or # more times (matching the most amount # possible)) #--------------------------------------------------------------------- +- ) # end of grouping #--------------------------------------------------------------------- +- ) # end of grouping #--------------------------------------------------------------------- +- }x; # end of qr print "$_\n" for "1 plus 1 is 2" =~ m/$REint/g __END__ 1 1 2