Группа балансировки регулярных выражений
Я пытаюсь сопоставить балансировочные скобки ({}) в строках. Например, я хочу сбалансировать следующее:
if (a == 2)
{
doSomething();
{
int x = 10;
}
}
// this is a comment
while (a <= b){
print(a++);
}
Я придумал это регулярное выражение из MSDN, но он не работает хорошо. Я хочу извлечь несколько вложенных подходящих наборов {}. Меня интересует только родительский матч
"[^{}]*" +
"(" +
"((?'Open'{)[^{}]*)+" +
"((?'Close-Open'})[^{}]*)+" +
")*" +
"(?(Open)(?!))";
1 ответ
Решение
Ты довольно близко
Адаптировано из второго ответа на этот вопрос (я использую этот ответ в качестве своего канонического ответа "балансировка xxx в C#/.NET regex engine", добавьте его, если он помог вам! Это помогло мне в прошлом):
var r = new Regex(@"
[^{}]* # any non brace stuff.
\{( # First '{' + capturing bracket
(?:
[^{}] # Match all non-braces
|
(?<open> \{ ) # Match '{', and capture into 'open'
|
(?<-open> \} ) # Match '}', and delete the 'open' capture
)+ # Change to * if you want to allow {}
(?(open)(?!)) # Fails if 'open' stack isn't empty!
)\} # Last '}' + close capturing bracket
"; RegexOptions.IgnoreWhitespace);