Phoenix.pm: Regex question

Scott Walters phaedrus at contactdesigns.com
Fri Feb 2 12:56:27 CST 2001


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