Phoenix.pm: Regex question
Josh Hardison at ADS
josh at autodispatch.com
Fri Feb 2 17:36:01 CST 2001
Doug,
Take the paren's out of the expression:
my @tokens = $string =~ /"[^"]+"|\S+/g;
When you match on one side of the pipe, you get an empty match on the
other. Something like that, anyway. Kinda unintuitive.
Josh Hardison
On Fri, 2 Feb 2001, Scott Walters wrote:
>
> Doug,
>
> |DailyNAV|Class C|||nav <-- output of your version
> ||DailyNAV| |Class C|| ||nav <-- output of same regex used in split() on same string
>
> Regex can match 0 character things, like with split //, $str;... but looking
> at the regex, nothing in there would match something 0 chracters long, so
> I don't know =)
>
> Hmm. Tried a few other regexes that also "should work" and had no luck. Only
> thing I can think of is work around the mystery/problem:
>
> my @tokens = grep { $_ ? 1 : 0 } $string =~ /"([^"]+)"|(\S+)/g;
>
> -scott
>
>
>
> On Fri, 2 Feb 2001, Doug Miles wrote:
>
> > This is probably something obvious, but I don't have my regex book with
> > me, and can't seem to figure it out. I'm trying to parse space
> > delimited information, somewhat like the UNIX command line. Whitespace
> > delimits parameters, but parameters can containg whitespace if
> > surrounded by quotes. Here's the code:
> >
> > #!/usr/bin/perl
> >
> > my $string = qq(DailyNAV "Class C" nav);
> >
> > my @tokens = $string =~ /(\S+)/g;
> > my @tokens = $string =~ /"([^"]+)"/g;
>
>
> > my @tokens = $string =~ /"([^"]+)"|(\S+)/g;
> > print join('|', @tokens) . "\n";
> >
> > here is the output:
> >
> > DailyNAV|"Class|C"|nav
> > Class C
> > |DailyNAV|Class C|||nav
> >
> > The first two regexes do what I expect. When I combine them in the
> > third, I get extra "null matches". Any ideas as to what I'm doing
> > wrong?
> >
> > --
> > - Doug
> >
> > Encrypted with ROT-26 - all attempts to decrypt are illegal under the
> > DMCA!
> >
>
More information about the Phoenix-pm
mailing list