Если вы хотите соответствовать сбалансированным скобкам, регулярное выражение не является подходящим инструментом для работы. Некоторые реализации регулярных выражений облегчают рекурсивное сопоставление с образцом (PHP и Perl, о которых я знаю), но AFAIK, C # не может этого сделать ( EDIT : см. Комментарий Стива ниже: ).
С помощью регулярных выражений вы можете сопоставить до определенной глубины, но это очень быстро взрывается у вас на лице. Например, это:
\(([^()]|\([^()]*\))*\)
смысл
\( # match the character '('
( # start capture group 1
[^()] # match any character from the set {'0x00'..''', '*'..'ÿ'}
| # OR
\( # match the character '('
[^()]* # match any character from the set {'0x00'..''', '*'..'ÿ'} and repeat it zero or more times
\) # match the character ')'
)* # end capture group 1 and repeat it zero or more times
\) # match the character ')'
будет соответствовать одиночным вложенным скобкам, таким как (a (c b 7))
и (a (x) b (y) c (z) d)
, но не будет соответствовать (a(b(c)))
.