Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

Re: Matching parens on a regex is beating me

by Roy Johnson (Monsignor)
on Apr 22, 2008 at 18:33 UTC ( #682246=note: print w/replies, xml ) Need Help??

in reply to Matching parens on a regex is beating me

perldoc -q matching:

How do I find matching/nesting anything?

This isn't something that can be done in one regular expression, no matter how complicated. To find something between two single characters, a pattern like /x([^x]*)x/ will get the intervening bits in $1. For multiple ones, then something more like /alpha(.*?)omega/ would be needed. But none of these deals with nested patterns. For balanced expressions using (, {, [ or < as delimiters, use the CPAN module Regexp::Common, or see "(??{ code })" in perlre. For other cases, you'll have to write a parser.

That said, for your situation, you can repeatedly find the innermost expression and replace it using a dispatch table:
my %arg_xlate = ( func1 => sub { "proc1{$_[0]}" } , func2 => sub { "FUNC $_[0] END" } ); while (<DATA>) { my $line = $_; 0 while ($line =~ s/(func[12])\(([^()]*)\)/$arg_xlate{$1}($2)/ge); print $line; } __DATA__ func1(input1, func2(input2, input3)) func2(func1(input1, input2), input3)

Caution: Contents may have been coded under pressure.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (3)
As of 2023-04-01 17:57 GMT
Find Nodes?
    Voting Booth?

    No recent polls found