RaphaelH
RaphaelH

Reputation: 2184

Perl Regex match balanced parentheses

Following strings - match:

"MNO(A=(B=C) D=(E=F)) PQR(X=(G=H) I=(J=(K=L)))" - "MNO"
"MNO(A=(B=C) D=(E=F))" - "MNO"
"MNO" - "MNO"
"RAX.MNO(A=(B=C) D=(E=F)) PQR(X=(G=H) I=(J=(K=L)))" - "RAX.MNO"
"RAX.MNO(A=(B=C) D=(E=F))" - "RAX.MNO"
"RAX.MNO" - "RAX.MNO"

Inside every brace, there can be unlimited groups of them, but they have to be closed properly.

Any ideas? Don't know how to test properly for closure.

I have to use a Perl-Regular-Expression.

Upvotes: 0

Views: 461

Answers (1)

Tim Pietzcker
Tim Pietzcker

Reputation: 336468

In Perl or PHP, for example, you could use a regex like

/\((?:[^()]++|(?R))*\)/

to match balanced parentheses and their contents.

See it on regex101.

To remove all those matches from a string $subject in Perl, you could use

$subject =~ s/\((?:[^()]++|(?R))*\)//g;

Explanation:

\(       # Match a (
(?:      # Start of non-capturing group:
 [^()]++ # Either match one or more characters except (), don't backtrack 
|        # or
 (?R)    # Match the entire regex again, recursively
)*       # Any number of times
\)       # Match a )

Upvotes: 4

Related Questions