Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

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.

Comment on Re: Matching parens on a regex is beating me
Select or Download Code

Log In?

What's my password?
Create A New User
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 making s'mores by the fire in the courtyard of the Monastery: (9)
As of 2015-03-30 09:35 GMT
Find Nodes?
    Voting Booth?

    When putting a smiley right before a closing parenthesis, do you:

    Results (635 votes), past polls