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]上获得最后一个组
当我搜索(($1)($2)($3)){2}时,NSRegularExpression只能获取最后一个组吗
发布于 2012-03-04 19:27:01
重复的反向引用只捕获最后一次重复。您的正则表达式确实匹配最后一行中的所有四个实例,但是它会用下一个匹配覆盖每个匹配,最后只留下[04:39.50]。
解决方案:重复一个非采集分组,将重复结果放入采集分组:
((?:\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\])+)(.+)当然,您仍然只能在最后一次重复时通过$4访问$2 --但这是正则表达式的一般限制。如果需要单独访问每个匹配,直到分钟/秒/帧部分,则使用
((?:\\[\\d{2}:\\d{2}\\.\\d{2}\\])+)(.+)首先匹配每一行,然后在迭代中对$1应用第二个正则表达式,以提取分钟数等:
\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\]https://stackoverflow.com/questions/7749701
复制相似问题