0
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

我想得到for groups,[04:51.50][04:45.50][04:43.50][04:39.50]但我只能得到最后一个[04:39.50]

NSRegularExpression我搜索时只能得到最后一组吗(($1)($2)($3)){2}

4

1 回答 1

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})\\]
于 2012-03-04T11:27:00.937 回答