Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Re: multi-line regex match quest

by sauoq (Abbot)
on Sep 29, 2002 at 05:20 UTC ( [id://201522]=note: print w/replies, xml ) Need Help??

in reply to multi-line regex match quest

$ret = $1 if $g =~ /\n\s*\n((?m:^#.*\n)+)$id/;
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re: Re: multi-line regex match quest
by smackdab (Pilgrim) on Sep 29, 2002 at 06:04 UTC
    thanks thanks thanks
    (I only understand it about 50% so far...)
      (I only understand it about 50% so far...)

      Well let me see if I can shed some light.

      $ret = $1 if $g =~ /\n\s*\n((?m:^#.*\n)+)$id/;
      The first bit is obviously just assigning $1 to $ret if the pattern matches. That's the easy part. Now let's look at the pattern.
      /\n\s*\n # This matches your blank line between comments. ( # Capture into $1. (?m: # Don't capture, but match this group as multiline. Wh +ich means match '^' and '$' # at the beginning or end of any line in the string. ^# # Match the comment delimiter at the start of a line. .*\n # Match everything up to, and including, the newline a +t the end of a line. )+ # Match this group one or more times. ) # End of $1 capture. $id # This is the key you're looking for. /x
      Very well done. sauoq++


      Yak it up with Fullscreen ChatBox

        And since I'm getting excited about Perl6 pattern matching and want the practice, let's do this with a Perl6 rule, line for line with the above Perl5 regex.
        # <Perl6> /^^ \h* $$ # Match a line that only contains horizontal whitespace, + if anything (blank line). ( # Capture to $1. [ # Group, but don't capture. ^^ \# # Comment delimiter at the start of a line. .* $$ # Everything until the end of the line, includes the new +line. ]+ # One or more comment lines in a row. ) # End $1 capture. $id # The key we're looking for. This matches as a literal s +tring, not a pattern. / # </Perl6>
        And here's the short version:
        m/^^ \h* $$ $ret:=([^^ \# .* $$]+) $id/;
        You can see I added a small bit ('$ret:=') just before the capture. This binds the value of the capture, $1 in this case, to $ret if the pattern matches, but not if it fails. Just what we want.


        Yak it up with Fullscreen ChatBox

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://201522]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (6)
As of 2024-04-22 06:37 GMT
Find Nodes?
    Voting Booth?

    No recent polls found