NSRegularexpression многострочный и стек

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

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

Любая помощь будет оценена

Грегуар

PS: я прокомментировал неработающее регулярное выражение

    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]]);
    }

person Gregoire Mulliez    schedule 16.04.2013    source источник


Ответы (1)


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

\{\{([^/]*?)\}\}(.*?)\{\{(/\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
person Anirudha    schedule 16.04.2013
comment
спасибо за помощь, я не знал/нашел понятие группы. Это работает хорошо, за исключением того, что я сделал небольшое изменение для нескольких списков: @\\{\\{([^/]*?)\\}\\} .*? (вот изменение) \\{\\{((/\\1)|(//))\\}\\} - person Gregoire Mulliez; 16.04.2013