Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^7: Regex's, parentheses, and the mysterious ( ??{ } ) operator

by Clovis_Sangrail (Beadle)
on Jul 15, 2013 at 17:08 UTC ( [id://1044422]=note: print w/replies, xml ) Need Help??


in reply to Re^6: Regex's, parentheses, and the mysterious ( ??{ } ) operator
in thread Regex's, parentheses, and the mysterious ( ??{ } ) operator

"You have to properly account for all capturing groups in the overall regex..."

I did not yet work through your example program or explore the references you gave me, but your sentence above jolted my brain into some semblance of activity. Yes, it makes a lot of sense that every time the recursive regex satisfies another capture group, it uses yet another capture variable. So I printed out a bunch of them:

$ cat p7.pl #!/opt/perl5.16/bin/perl use strict; use warnings; our $paren = qr/ # Need declared variable with use stri +ct. \( ( [^()]+ # Not parens | (??{our $paren}) # Another balanced group (not interpol +ated yet) )* \) /x; # 'x' means ignore whitespace, comment +s. my $stuff = "On the outside now then (we go( in( and in (&stop)(awhile +) ( further ))) but still (here) ) and now ((for a while)) we are out + again."; $stuff =~ /($paren)[^()]*($paren)/; print "-original-\n"; print "$stuff\n"; print "1---------\n"; print 'X' . $1 . 'X' . "\n"; print "2---------\n"; print 'X' . $2 . 'X' . "\n"; print "3---------\n"; print 'X' . $3 . 'X' . "\n"; print "4---------\n"; print 'X' . $4 . 'X' . "\n"; print "5---------\n"; print 'X' . $5 . 'X' . "\n"; print "6---------\n"; print 'X' . $6 . 'X' . "\n"; print "----------\n"; $ ./p7.pl -original- On the outside now then (we go( in( and in (&stop)(awhile) ( further ) +)) but still (here) ) and now ((for a while)) we are out again. 1--------- X(we go( in( and in (&stop)(awhile) ( further ))) but still (here) )X 2--------- X X 3--------- X((for a while))X 4--------- X(for a while)X 5--------- Use of uninitialized value $5 in concatenation (.) or string at ./p7.p +l line 31. XX 6--------- Use of uninitialized value $6 in concatenation (.) or string at ./p7.p +l line 33. XX ---------- $

So the recursive regex evaluation set $1 through $4! Thanks, this makes more sense now.

Replies are listed 'Best First'.
Re^8: Regex's, parentheses, and the mysterious ( ??{ } ) operator
by AnomalousMonk (Archbishop) on Jul 15, 2013 at 19:24 UTC
    ... every time the recursive regex satisfies another capture group, it uses yet another capture variable.

    Old-style, numbered capture groups are counted according to the literal order in which their opening parentheses appear in the final, compiled regex; they are not created at run-time and do not depend on the evaluation, recursive or otherwise, of any regex sub-expression at run-time. (Of course, the actual capturing happens at run-time!) In the example below, the final regex  $ry (after full interpolation) is printed and the capture groups marked and counted (at least, that's what I tried to do!). Sorry for any wrap-around, which may make this difficult to read. Look for examples of capture group counting in perlre and perlretut.

    >perl -wMstrict -le "my $s = 'x(y) (a(b)) ()() q (a(b)c()(d(e(f)g))h) q'; ;; our $rx = qr{ \( ([^()]* | (??{ our $rx }))* \) }xms; ;; my $ry = qr{ ($rx) [^()]* ($rx) }xms; ;; $s =~ $ry; print qq{1st '$1' 3rd '$3'}; ;; print qq{\nfinal regex:}; print $ry; " 1st '(y)' 3rd '(a(b))' final regex: (?^msx: ((?^msx: \( ([^()]* | (??{ our $rx }))* \) )) [^()]* ((?^msx: +\( ([^()]* | (??{ our $rx }))* \) )) )
    counted capture groups: (?^msx: ((?^msx: \( ([^()]* | (??{ our $rx }))* \) )) [^()]* ((?^msx: +\( ([^()]* | (??{ our $rx }))* \) )) ) | | | | | + | | | 1st begin 2nd begin 2-end 1st end 3rd begin + 4th begin 4-end 3rd end

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2024-04-25 21:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found