次のような特別な表記法で、型名のジェネリック引数 (ジェネリックにすることもできます) をキャプチャする正規表現を記述する必要があります。
System.Action[Int32,Dictionary[Int32,Int32],Int32]
型名が[\w.]+
でパラメータが であると仮定し[\w.,\[\]]+
てInt32
、Dictionary[Int32,Int32]
Int32
基本的にはグループスタックのバランスが取れていない場合は何かを取る必要がありますが、その方法がよくわかりません。
UPD
以下の回答は、問題を迅速に解決するのに役立ちました (ただし、適切な検証がなく、深さの制限 = 1 の場合) が、グループの分散を使用してそれを行うことができました:
^[\w.]+ #Type name
\[(?<delim>) #Opening bracet and first delimiter
[\w.]+ #Minimal content
(
[\w.]+
((?(open)|(?<param-delim>)),(?(open)|(?<delim>)))* #Cutting param if balanced before comma and placing delimiter
((?<open>\[))* #Counting [
((?<-open>\]))* #Counting ]
)*
(?(open)|(?<param-delim>))\] #Cutting last param if balanced
(?(open)(?!) #Checking balance
)$
UPD2 (最後の最適化)
^[\w.]+
\[(?<delim>)
[\w.]+
(?:
(?:(?(open)|(?<param-delim>)),(?(open)|(?<delim>))[\w.]+)?
(?:(?<open>\[)[\w.]+)?
(?:(?<-open>\]))*
)*
(?(open)|(?<param-delim>))\]
(?(open)(?!)
)$