Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

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/;
-sauoq
"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
    AWESOME AWESOME AWESOME
    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++

      kelan


      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.

        kelan


        Yak it up with Fullscreen ChatBox

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (6)
As of 2024-04-18 19:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found