#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})\]