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