For Programmers: Free Programming Magazines  


Home > Archive > PERL Miscellaneous > March 2008 > Matching many when valid line exists









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Matching many when valid line exists
Leon Williams

2008-03-27, 10:16 pm

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?
Ben Morrow

2008-03-28, 4:40 am


Quoth Leon Williams <noel.james@gmail.com>:
> 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

Leon Williams

2008-03-28, 4:40 am

On Mar 27, 11:15 pm, Ben Morrow <b...@morrow.me.uk> wrote:
> Quoth Leon Williams <noel.ja...@gmail.com>:
>
>
>
>
>
>
>
>
> 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.
John W. Krahn

2008-03-28, 4:40 am

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
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com