2013-04-16 5 views
0

Я не могу найти регулярное выражение, имеющее сбалансированные теги, одно для открытия и одно для закрытия. Теги должны содержать текст нескольких строк; и теги динамические, не определены во время компиляцииNSRegularexpression multiline and stack

Я не могу сопоставить закрывающий тег, соответствующий открытому тегу, например {{home}} -> {{home}} и {{hello}} - > {{/ hello}}; она соответствует {{дом}} на {{/ привет}} Любая помощь будет принята с благодарностью

Любая помощь будет принята с благодарностью

Gregoire

пс: Я заметил, неработающего регулярному_выражению

NSString * string; 
    NSError* error = nil; 
    NSRegularExpression* regex; 
    NSArray* matches; 


    string = 
    @" The {{demo}}following tables describe the {{/demo}}character expressions" 
    " used by the regular expression to match patterns within " 
    " a string,{{home}} the pattern operators that specify how many" 
    " times a pattern is matched and additional matching" 
    " restrictions, and the last {{/home}}table specifies flags" 
    " that can be included in the regular "; 


    regex = [NSRegularExpression regularExpressionWithPattern: 
      @"\\{\\{demo\\}\\}" 
      "(.*)?" 
      "\\{\\{(//|/demo)\\}\\}" 
                 options:NSRegularExpressionDotMatchesLineSeparators 
                 error:&error]; 


// regex = [NSRegularExpression regularExpressionWithPattern: 
//    @"\\{\\{.*\\}\\}" 
//    "(.*)?" 
//    "\\{\\{(//|/.*)\\}\\}" 
//              options:NSRegularExpressionDotMatchesLineSeparators 
//              error:&error]; 


    matches = [regex matchesInString:string 
          options:NSRegularExpressionDotMatchesLineSeparators 
           range:NSMakeRange(0, [string length])]; 

    for (NSTextCheckingResult* match in matches) 
    { 
     NSLog(@"### %@ ###", [string substringWithRange:[match range]]); 
    } 

ответ

0

Вы можете использовать этот шаблон

\{\{([^/]*?)\}\}(.*?)\{\{(/\1|//)\}\} 
    -------  ----  -------- 
     |   |   |->matches closing tag having value same as group 1 or // 
     |   |->content in group 2 
     |->matches the opening tag value and captures it in group1 
+0

поблагодарить вас за помогите, я не знал/не нашел концепцию групп. Он работает хорошо, за исключением того, что я сделал небольшую замену для нескольких списков: @ "\\ {\\ {([^ /] *?) \\} \\}" ". *?" (здесь есть изменение) "\\ {\\ {((\\ 1) | (//)) \\} \\}" –

+0

работает как шарм, спасибо –