Я хочу добавить этот ответ для быстрой ссылки. Невозможно обновить.
.NET Regex с использованием балансировочных групп .
\((?>\((?)|[^()]+|\)(?<-c>))*(?(c)(?!))\)
Где c
используется как счетчик глубины.
PCRE с использованием рекурсивного шаблона .
\((?>[^)(]+|(?R))*+\)
Демонстрация в regex101 ; Или без чередования:
\((?>[^)(]*(?R)?)*+\)
Демо в regex101 ; Или разворачивается для исполнения:
\([^)(]*(?:(?R)[^)(]*)*+\)
Демонстрация в regex101 ; Рисунок наклеивается на (?R)
, который представляет (?0)
.
Perl, PHP, Notepad ++, R : perl = TRUE , Python : пакет Regex с (?V1)
для поведения Perl.
Ruby с использованием вызовов подвыражения .
С Ruby 2.0 \g<0>
можно использовать для вызова полного шаблона.
\((?>[^)(]+|\g<0>)*\)
Демоверсия в Rubular ; Ruby 1.9 поддерживает только рекурсию группы захвата группы :
(\((?>[^)(]+|\g<1>)*\))
Демо в Rubular & nbsp; ( атомная группировка с Ruby 1.9 .3)
JavaScript & nbsp; API :: XRegExp.matchRecursive
XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
JS, Java и другие ароматы регулярных выражений без рекурсии до 2 уровня вложенности:
\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)
Демонстрация в regex101 . Более глубокое вложение нужно добавить к рисунку. Чтобы ускорить работу с несбалансированными скобками , снимите квантор +
.
Java: интересная идея с использованием прямых ссылок by @jaytea .