正規表現 括弧 入れ子 表現
※正しさは保証しません(深く検証してない)
\(([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?|[^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?|[^\(\)]*?\([^\(\)]*?\)[^\(\)]*?|[^\(\)]*?)\)
上記は4重までの入れ子の"全体"を指定するパターン
中身の特定の部分を取り出すとかは考えてないです
複数のネストが並ぶ木構造?は考慮してません
解説
●一番外側の括弧 :\( ~ \)
\( ~ ([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?|[^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?|[^\(\)]*?\([^\(\)]*?\)[^\(\)]*?|[^\(\)]*?) ~ \)
一回目の括弧をグルーピングに入れようとすると分かりづらくなると思うので外側に置いてます
全体が欲しい時は ($1) としてください
●それぞれのネスト構造をORで包括
( ~ [^\(\)]*?\([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?\)[^\(\)]*? | [^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*? | [^\(\)]*?\([^\(\)]*?\)[^\(\)]*? | [^\(\)]*? ~ )
"|"(パイプ)ってグルーピングするんですね
●ネスト表現
・1個(ネスト無し)
[^\(\)]*?
グルーピングの外側に置いた括弧までの"括弧以外( [^\(\)] )"の文字の最短一致指定
「A*?X」のように量指定子(+,*)の後に"?"を付けると、? の後の文字(X)が"最初に"現れるまでAをキャプチャします。めっちゃ便利。好き
・2個
[^\(\)]*?\([^\(\)]*?\)[^\(\)]*?
ネスト無しの前後に "[^\(\)]*?\(" と "\)[^\(\)]*?" で括弧と括弧以外の文字最短連続の表現
・3個
[^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?
ネスト2個の前後に "[^\(\)]*?\(" と "\)[^\(\)]*?" で括弧と括弧以外の文字最短連続の表現
繰り返し部分が出てきましたね
・4個
[^\(\)]*?\([^\(\)]*?\([^\(\)]*?\([^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?\)[^\(\)]*?
ネスト3個の後に "[^\(\)]*?\(" と "\)[^\(\)]*?" で括弧と括弧以外の文字最短連続の表現
つまりは前のネスト表現の前後に "[^\(\)]*?\(" と "\)[^\(\)]*?"を加えれば一段階深いネストを表現できます
●ネスト構造の並び順
ネストが深い順で並べます
浅い順だと、3重4重と深いネストの時、まずは \( [^\(\)]*? \) と、")"が最初に出るまでの全文字最短検索でキャプチャして望んだ通りの範囲になってくれません
有用サイト
この記事が気に入ったらサポートをしてみませんか?