regexperlbraces

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.


Solution

  • 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 )