NSRegularExpression в Objective-C - PullRequest
       15

NSRegularExpression в Objective-C

0 голосов
/ 13 октября 2011
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\])+(.+)" options:NSRegularExpressionAllowCommentsAndWhitespace error:&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

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

Разве NSRegularExpression может получить только последняя группа при поиске (($1)($2)($3)){2}

1 Ответ

1 голос
/ 04 марта 2012

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

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

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

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

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

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

\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...