Matching many when valid line exists

Discussion in 'Perl Misc' started by Leon Williams, Mar 28, 2008.

  1. I am pulling my hair out trying to make a regex that will
    1) Validate an entire line of input
    2) Return any number of matches in the line

    The condition is that any number of product codes must exist on a line
    separated a space. It may or may not start or end with spaces. The
    product code is a 10 digit number.

    Example Valid Input:
    "1234567890 0987654321 5678901234"

    Current Expression:
    /^[ ]?([\d]{10}[ ])*?([\d]{10})[ ]?$/

    This expression seems to validate well enough but, it only matches the
    last two occurrences.

    Any suggestions?
    Leon Williams, Mar 28, 2008
    #1
    1. Advertising

  2. Leon Williams

    Ben Morrow Guest

    Quoth Leon Williams <>:
    > I am pulling my hair out trying to make a regex that will
    > 1) Validate an entire line of input
    > 2) Return any number of matches in the line
    >
    > The condition is that any number of product codes must exist on a line
    > separated a space. It may or may not start or end with spaces. The
    > product code is a 10 digit number.
    >
    > Example Valid Input:
    > "1234567890 0987654321 5678901234"
    >
    > Current Expression:
    > /^[ ]?([\d]{10}[ ])*?([\d]{10})[ ]?$/
    >
    > This expression seems to validate well enough but, it only matches the
    > last two occurrences.


    Capture buffers with a quantifier (/(...)*/) only capture the last
    occurrence. To get all of them you have to use the /g flags and match in
    list context, but in this case it would be easier to use something like

    my $input = '1234567890 0987654321 5678901234';
    my @codes = split ' ', $input;
    for (@codes) {
    /\D/ and die "non-numeric code: '$_'";
    length == 10 or die "bad code length: '$_'";
    }

    Ben
    Ben Morrow, Mar 28, 2008
    #2
    1. Advertising

  3. On Mar 27, 11:15 pm, Ben Morrow <> wrote:
    > Quoth Leon Williams <>:
    >
    >
    >
    > > I am pulling my hair out trying to make a regex that will
    > > 1) Validate an entire line of input
    > > 2) Return any number of matches in the line

    >
    > > The condition is that any number of product codes must exist on a line
    > > separated a space. It may or may not start or end with spaces. The
    > > product code is a 10 digit number.

    >
    > > Example Valid Input:
    > > "1234567890 0987654321 5678901234"

    >
    > > Current Expression:
    > > /^[ ]?([\d]{10}[ ])*?([\d]{10})[ ]?$/

    >
    > > This expression seems to validate well enough but, it only matches the
    > > last two occurrences.

    >
    > Capture buffers with a quantifier (/(...)*/) only capture the last
    > occurrence. To get all of them you have to use the /g flags and match in
    > list context, but in this case it would be easier to use something like
    >
    > my $input = '1234567890 0987654321 5678901234';
    > my @codes = split ' ', $input;
    > for (@codes) {
    > /\D/ and die "non-numeric code: '$_'";
    > length == 10 or die "bad code length: '$_'";
    > }
    >
    > Ben



    Your right,
    I got sucked into the vortex of making something more complex (and
    more interesting) then it needed to be.
    Thanks the reality check.
    Leon Williams, Mar 28, 2008
    #3
  4. Leon Williams wrote:
    > I am pulling my hair out trying to make a regex that will
    > 1) Validate an entire line of input
    > 2) Return any number of matches in the line
    >
    > The condition is that any number of product codes must exist on a line
    > separated a space. It may or may not start or end with spaces. The
    > product code is a 10 digit number.
    >
    > Example Valid Input:
    > "1234567890 0987654321 5678901234"
    >
    > Current Expression:
    > /^[ ]?([\d]{10}[ ])*?([\d]{10})[ ]?$/
    >
    > This expression seems to validate well enough but, it only matches the
    > last two occurrences.
    >
    > Any suggestions?


    $ perl -le'
    for ( " 1234567890 0987654321 5678901234 ", " 1234567890 ", " ", " 12345
    " ) {
    $count = @matches = / (?<=\A| ) \d{10} (?= |\z) /xg;

    print qq["$_" ], $count ? "matched @matches." : "did not match.";
    }
    '
    " 1234567890 0987654321 5678901234 " matched 1234567890 0987654321
    5678901234.
    " 1234567890 " matched 1234567890.
    " " did not match.
    " 12345 " did not match.



    John
    --
    Perl isn't a toolbox, but a small machine shop where you
    can special-order certain sorts of tools at low cost and
    in short order. -- Larry Wall
    John W. Krahn, Mar 28, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Marco Ippolito
    Replies:
    0
    Views:
    2,575
    Marco Ippolito
    Oct 11, 2004
  2. Totan
    Replies:
    0
    Views:
    937
    Totan
    Apr 17, 2006
  3. Ulf Meinhardt
    Replies:
    8
    Views:
    6,141
  4. Marc Bissonnette

    Pattern matching : not matching problem

    Marc Bissonnette, Jan 8, 2004, in forum: Perl Misc
    Replies:
    9
    Views:
    233
    Marc Bissonnette
    Jan 13, 2004
  5. Bobby Chamness
    Replies:
    2
    Views:
    226
    Xicheng Jia
    May 3, 2007
Loading...

Share This Page