I want to add this answer for quickreference. Feel free to update.
.NET Regex using balancing groups.
\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)
Where c
is used as the depth counter.
PCRE using a recursive pattern.
\((?:[^)(]+|(?R))*+\)
Demo at regex101; Or without alternation:
\((?:[^)(]*(?R)?)*+\)
Demo at regex101; Or unrolled for performance:
\([^)(]*+(?:(?R)[^)(]*)*+\)
Demo at regex101; The pattern is pasted at (?R)
which represents (?0)
.
Perl, PHP, Notepad++, R: perl=TRUE, Python: Regex package with (?V1)
for Perl behaviour.
Ruby using subexpression calls.
With Ruby 2.0 \g<0>
can be used to call full pattern.
\((?>[^)(]+|\g<0>)*\)
Demo at Rubular; Ruby 1.9 only supports capturing group recursion:
(\((?>[^)(]+|\g<1>)*\))
Demo at Rubular (atomic grouping since Ruby 1.9.3)
JavaScript API :: XRegExp.matchRecursive
XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
JS, Java and other regex flavors without recursion up to 2 levels of nesting:
\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)
Demo at regex101. Deeper nesting needs to be added to pattern.
To fail faster on unbalanced parenthesis drop the +
quantifier.
Java: An interesting idea using forward references by @jaytea.