develooper Front page | perl.perl6.language.regex | Postings from December 2000

Re: Perl 5's "non-greedy" matching can be TOO greedy!

From:
Jeff Pinyan
Date:
December 14, 2000 17:51
Subject:
Re: Perl 5's "non-greedy" matching can be TOO greedy!
Message ID:
Pine.GSO.4.21.0012142047500.4213-100000@crusoe.crusoe.net
On Dec 14, Randal L. Schwartz said:

>Deven> I haven't even SEEN an example where the current behavior is
>Deven> actually preferable than my proposed behavior, have you?  (And
>Deven> I'd expect at least a FEW, though I suspect there are probably
>Deven> more counterexamples.)
>
>If I want the leftmost B that is followed by the shortest number
>of characters to get to a D, I write /B.*?D/.  The "leftmost" part
>keeps getting left out of regex discussions, and maybe that's why
>you're thrown off.  But it's a pretty consistent overriding factor.
>
>If you want something odd like "not necessarily the leftmost", then
>you'll need to speak more.  But "leftmost" is fundamental to the
>design of regex.  Don't mess with that.  Or don't call it a regex any
>more.

You could use my sexeger technique to get this behavior (possibly):

  $string = "aaabbbcccdddeee";
  # regex to be reversed: /b(.*?)d/
  $revstr = reverse $string;
  ($match) = $revstr =~ /d(.*?)b/;

No, that doesn't quite work.  It works when you unroll the .*? loop:

  # regex to be reversed: /b([^bd]*)d/
  ($match) = $revstr =~ /d([^bd]*)b/;

But then why would you use sexeger at all, when you can unroll the loop in
the forward direction?

  ($match) = $string =~ /b([^bd]*)d/;

-- 
Jeff "japhy" Pinyan     japhy@pobox.com    http://www.pobox.com/~japhy/
CPAN - #1 Perl Resource  (my id:  PINYAN)       http://search.cpan.org/
PerlMonks - An Online Perl Community          http://www.perlmonks.com/
The Perl Archive - Articles, Forums, etc.   http://www.perlarchive.com/




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About