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 グループを取得したいのです[04:51.50][04:45.50][04:43.50][04:39.50]が、最後の on しか取得できません[04:39.50]

検索NSRegularExpressionすると最後のグループしか取得できない(($1)($2)($3)){2}

4

1 に答える 1

1

繰り返される後方参照は、最後の繰り返しのみをキャプチャします。正規表現は最後の行の 4 つのインスタンスすべてに一致しますが、各一致を次の一致で上書き[04:39.50]し、最後にのみ残します。

解決策: 非キャプチャ グループを繰り返し、繰り返し結果をキャプチャ グループに入れます。

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

$2もちろん、最後の繰り返しまでしかアクセスできません$4が、これは正規表現の一般的な制限です。分/秒/フレームの部分まで、各一致に個別にアクセスする必要がある場合は、次を使用します

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

最初に各行を照合し、次に 2 番目の正規表現を$1繰り返し適用して分などを抽出します。

\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\]
于 2012-03-04T11:27:00.937 に答える