Как уже упоминалось другими: регулярное выражение не очень подходит для такой задачи. Однако, если ваши скобки не превышают фиксированное количество вложений, вы можете сделать это, но если вложенность может быть 3 или более, регулярное выражение станет трудной для написания (и поддержки!). Взгляните на регулярное выражение, которое соответствует круглой скобке, содержащей не более одной вложенной круглой скобки:
\((?:[^()]|\([^)]*\))*\)
, что означает:
\( # match the character '('
(?: # start non-capture group 1
[^()] # match any character not from the set {'(', ')'}
| # OR
\( # match the character '('
[^)]* # match any character not from the set {')'} and repeat it zero or more times
\) # match the character ')'
)* # end non-capture group 1 and repeat it zero or more times
\) # match the character ')'
Версия для 3 заставит ваши глаза кровоточить! Вы могли бы использовать функцию рекурсивного сопоставления регулярных выражений в .NET, но я бы лично не пошел: разбрызгивание рекурсии внутри регулярных выражений приводит к безумию! (не совсем, конечно, но регулярные выражения достаточно сложны, чтобы понять и смешать рекурсию в миксе, не делает это более понятным IMO)
Я бы просто написал небольшой метод, который мог бы выглядеть так: Python:
def find_parens(str):
matches = []
parens = 0
start_index = -1
index = 0
for char in str:
if char == '(':
parens = parens+1
if start_index == -1:
start_index = index
if char == ')':
parens = parens-1
if parens == 0 and start_index > -1:
matches.append(str[start_index:index+1])
start_index = -1
index = index+1
return matches
for m in find_parens("dfgdgdfg (aaa.bbb) sfd (c) fdsdfg ( ,ddd (eee) )"):
print(m)
который печатает:
(aaa.bbb)
(c)
( ,ddd (eee) )
Я не знаком с C #, но приведенный выше код на Python читается так же, как псевдокод, и не потребует много усилий для преобразования в C #, я полагаю.