ここでは別のアプローチが必要だと思います。最初の大きなグループに一致するとR{R{abc}aD{mnoR{xyz}}}
(タイポの可能性についての私のコメントを参照してください)、正規表現では個々のグループをキャプチャできないため、内部のサブグループを取得できませんR{ ... }
。
したがって、消費せずにキャプチャする何らかの方法が必要であり、それを行うための明白な方法は、前向きな先読みを使用することでした. そこから、フォーカスの新しい変更に適応するためにいくつかの変更はありますが、使用した式を配置できます。
(?=([A-Z](?:(?:(?'O'{)[^{}]*)+(?:(?'-O'})[^{}]*?)+)+(?(O)(?!))))
[また、'Open' の名前を 'O' に変更し、閉じブレースの名前付きキャプチャを削除して短くし、一致のノイズを回避しました]
regexhero.net (私がこれまでに知っている唯一の無料の .NET 正規表現テスター) で、次のキャプチャ グループを取得しました。
1: R{R{abc}aD{mnoR{xyz}}}
1: R{abc}
1: D{mnoR{xyz}}
1: R{xyz}
正規表現の内訳:
(?= # Opening positive lookahead
([A-Z] # Opening capture group and any uppercase letter (to match R & D)
(?: # First non-capture group opening
(?: # Second non-capture group opening
(?'O'{) # Get the named opening brace
[^{}]* # Any non-brace
)+ # Close of second non-capture group and repeat over as many times as necessary
(?: # Third non-capture group opening
(?'-O'}) # Removal of named opening brace when encountered
[^{}]*? # Any other non-brace characters in case there are more nested braces
)+ # Close of third non-capture group and repeat over as many times as necessary
)+ # Close of first non-capture group and repeat as many times as necessary for multiple side by side nested braces
(?(O)(?!)) # Condition to prevent unbalanced braces
) # Close capture group
) # Close positive lookahead
以下は C# では機能しません
再帰的な正規表現を使用するオプションがあったので、PCREエンジンでどのように機能するかを実際に試してみたかったのですが、私はそれに慣れていて、より短い正規表現が得られたので簡単だったと思います:)
(?=([A-Z]{(?:[^{}]|(?1))+}))
正規表現101のデモ
(?= # Opening positive lookahead
([A-Z] # Opening capture group and any uppercase letter (to match R & D)
{ # Opening brace
(?: # Opening non-capture group
[^{}] # Matches non braces
| # OR
(?1) # Recurse first capture group
)+ # Close non-capture group and repeat as many times as necessary
} # Closing brace
) # Close of capture group
) # Close of positive lookahead