正規表現によって多重括弧のような入れ子構造を表現することは難しいです。正規表現の難題、入れ子構造
入れ子構造が正しいことを示すにはスタックのデータ構造を表現することが望ましいですが、通常の正規表現ではスタックを用いることはできません。一部の正規表現エンジンにのみ備わっている再帰機能によってスタック構造を表現できます。再帰機能を備えた正規表現を使用可能な環境にはPHP、python、ruby、一部テキストエディタなどがあたります。正規表現のみに頼らないで文字列操作コードを書くことが可能なプログラミング言語では実装されていない場合が少なくないです。次の正規表現はPHPで動作する正規表現です。PHP: 再帰的パターン – Manual
/\((?:[^\(\)]+|(?R))*\)/
(?R)が再帰の記号です。この時点で再度正規表現全体を呼び出します。これは最大の大きさで成立している括弧を抜き出す目的の正規表現です。動作結果は下図の通りです。
詳しい動作の過程は次の通りです。この過程の説明はPHP Recursive Patterns – Stan Angeloff’s blogの説明の仕方を大きく参考にしています。
/
\( # 開き括弧 '(' を見つける.
(?: # 新しいグループの開始。これをしないと最初と最後の'('と')'が|に巻き込まれる。
[^\(\)]+# '('でも')'でもない文字をどん欲に消費する。
| # or
(?R) # '('か')'を読んだら、また最初から。再帰処理。
)
* # 可能な限り深いのネストを探索する.
\) # '('に対応する閉じ括弧 ')' を見つける.
/