NSRegularExpression в Objective-C

#objective-c #iphone #regex #nsregularexpression #regex-group

#objective-c #iPhone #регулярное выражение #nsрегулярная экспрессия #группа регулярных выражений #nsregularexpression

Вопрос:

 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\[(\d{2}):(\d{2})\.(\d{2})\]) (. )" options:NSRegularExpressionAllowCommentsAndWhitespace error:amp;error];

[regex enumerateMatchesInString:self options:NSMatchingReportProgress range:NSMakeRange(0, [self length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
        [*lyricObject addObject:[self substringWithRange:[match rangeAtIndex:5]]];
        NSLog(@"%@",[self substringWithRange:[match rangeAtIndex:1]]);
        [*stamp addObject:[NSString stringWithFormat:@"%d", ([[self substringWithRange:[match rangeAtIndex:2]] intValue] * 60     [[self substringWithRange:[match rangeAtIndex:3]] intValue] ) * 100   [[self substringWithRange:[match rangeAtIndex:4]] intValue]]];
}];
  

Точно так же, как код над входной строкой (self):

 [04:30.50]There are pepole dying
[04:32.50]If you care enough for the living
[04:35.50]Make a better place for you and for me
[04:51.50][04:45.50][04:43.50][04:39.50]You and for me
  

и я хочу получить группы for [04:51.50][04:45.50][04:43.50][04:39.50] для, но я могу получить только последнее на [04:39.50]

NSRegularExpression Можно ли получить только последнюю группу при поиске (($1)($2)($3)){2}

Ответ №1:

Повторная обратная ссылка фиксирует только последнее повторение. Ваше регулярное выражение соответствует всем четырем экземплярам в этой последней строке, но оно перезаписывает каждое совпадение следующим, оставляя только [04:39.50] в конце.

Решение: повторите группу без захвата и поместите повторяющийся результат в группу захвата:

 ((?:\[(\d{2}):(\d{2})\.(\d{2})\]) )(. )
  

Конечно, вы по-прежнему можете $2 получить доступ только $4 к последнему повторению, но это общее ограничение регулярных выражений. Если вам нужно получить доступ к каждому совпадению по отдельности, вплоть до минут / секунд / кадров, используйте

 ((?:\[\d{2}:\d{2}\.\d{2}\]) )(. )
  

сначала сопоставить каждую строку, а затем применить второе регулярное выражение к $1 итерации для извлечения минут и т. Д.:

 \[(\d{2}):(\d{2})\.(\d{2})\]