Ответ 1
К счастью,.NET допускает рекурсию в регулярных выражениях (см. Балансирующие определения групп):
Regex regexObj = new Regex(
@"\( # Match an opening parenthesis.
(?> # Then either match (possessively):
[^()]+ # any characters except parentheses
| # or
\( (?<Depth>) # an opening paren (and increase the parens counter)
| # or
\) (?<-Depth>) # a closing paren (and decrease the parens counter).
)* # Repeat as needed.
(?(Depth)(?!)) # Assert that the parens counter is at zero.
\) # Then match a closing parenthesis.",
RegexOptions.IgnorePatternWhitespace);
В случае, если кто-то задается вопросом: "Счетчик парнов" никогда не может опускаться ниже нуля (<?-Depth>
не удастся иначе), поэтому даже если скобки "сбалансированы", но не подобраны правильно (например, ()))((()
), это регулярное выражение не будет обмануто.
Для получения дополнительной информации прочитайте книгу Джеффри Фридла [a href= "http://shop.oreilly.com/product/9780596002893.do" rel= "noreferrer" > "Освоение регулярных выражений" (стр. 436)