Группа балансировки регулярных выражений - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь сопоставить балансировочные скобки ({}) в строках. Например, я хочу сбалансировать следующее:

if (a == 2)
{
  doSomething();
  { 
     int x = 10;
  }
}

// this is a comment

while (a <= b){
  print(a++);
} 

Я придумал это регулярное выражение из MSDN, но оно не работает. Я хочу извлечь несколько вложенных подходящих наборов {}. Меня интересует только родительский матч

   "[^{}]*" +
   "(" + 
   "((?'Open'{)[^{}]*)+" +
   "((?'Close-Open'})[^{}]*)+" +
   ")*" +
   "(?(Open)(?!))";

1 Ответ

5 голосов
/ 06 февраля 2012

Ты довольно близко.

Адаптировано со второго ответа на этот вопрос (я использую этот ответ в качестве своего канонического ответа "балансировка 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);
...