in reply to Re^2: Regex question - negatives
in thread Regex question - negatives

moritz's example is meant to be used with the x modifier which permits comments in a regex. For example:

my $re= qr{\[\[ # opening delimiter ( # capture... (?: # a group (?!\]\]) # that does not start with ]] . # and is a single character long )+ # and many of these groups, at least one. ) ]] # closing delimiter }x; while ($test =~ m{$re}g) { print "FOO:<$1>\n"; }

Replies are listed 'Best First'.
Re^4: Regex question - negatives
by ultranerds (Hermit) on Jan 13, 2011 at 10:51 UTC
    Hi,

    Ah cool, didn't know about that feature either =)

    Seems it doesn't wanna work with a s/// though?

    This works fine, and prints out all the tag I expected:
    while ($test =~ m{$re}g) { print "FOO:<$1>\n"; }
    ..while this only prints out the "test new line" one for some reason?
    $test =~ s{$re}{ print "BLA: $1 \n"; }ge
    EDIT, never mind - me being stupid with my syntax ;)

    TIA

    Andy
      ..while this only prints out the "test new line" one for some reason?

      while ($test =~ s{$re}{}ge) {
          print "BLA: $1 \n";
      }

      That is because s///g ignores context and just does all the replacements at once leaving the last match in $1.

      But m//g in scalar context will iterate through each match every time it is called in scalar context so that in a while loop $1 will contain each match in turn.

      Those "ah cool, I didn't know about that" moments are one reason I hang out around here.

      And you thought you were just going to get another set of eyes on your code....see Don't go all PerlMonks on me :-)

        heheh yeah, me too! Don't know where I would be without people like you on perlmonks - has saved my sanity many many times ;)

        BTW - that code works a charm :)

        my $re= qr{\[\[ # opening delimiter ( # capture... (?: # a group (?!\]\]) # that does not start with ]] . # and is a single character long )+ # and many of these groups, at least one. ) \]\] # closing delimiter }x; $section_contents =~ s{$re}{Process_Tag($1,$hidden_query,$tag_cfg, +$is_preview)}ge; # process stuff like [[1234]] or [[http://www.site.c +om]]
        Thanks again everyone!

        Cheers

        Andy