2015-03-14 1 views
2

Простой вопрос с регулярным выражением. У меня есть строка на следующем формате:Извлечь текст между двумя маркерами с регулярным выражением

[page] 
Some text with multi line. 
[page/] 

[page] 
Another text with multi line. 
[page/] 

[page] 
Third text with multi line. 
[page/] 

Что такое регулярное выражение для извлечения текста между [page] и [page/]?

Я использую этот код, но у меня только первый матч.

NSString *path = [[NSBundle mainBundle] pathForResource:@"File" ofType:@"txt"]; 
NSString *mainText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; 

NSError *error = NULL; 
NSRange range = NSMakeRange(0, mainText.length); 

    NSString *pattern = [NSString stringWithFormat:@"(?<=\\[page])(?s)(.*?)(?=\\[page/])"]; 
     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; 
     NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:mainText options:0 range:range]; 


     if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { 
      NSString *substringForFirstMatch = [mainText substringWithRange:rangeOfFirstMatch]; 
      NSLog(@"sub: %@", substringForFirstMatch); 
     } 

Как я могу, но текст каждого матча в NSArray?

+0

Почему вы не используете 'matchesInString: параметры: диапазон:' который возвращает '' NSArray' из NSTextCheckingResult' (который имеет свойство 'NSRange')? – Larme

ответ

2

Вы можете использовать matchesInString:options:range:, который возвращает массив совпадений, как NSTextCheckingResults:

NSString *pattern = [NSString stringWithFormat:@"(?<=\\[page\\])(.*?)(?=\\[page\\/\\])"]; 
    NSUInteger options = NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:&error]; 

    for (NSTextCheckingResult* result in [regex matchesInString:INPUT_STRING 
                options:0 
                 range:NSMakeRange(0, [input_string_length])]) 
    { 
     // further code 
    }