iOS 使用正则表达式拆分 NSString

iOS Split NSString with Regular Expression

我正在使用这段代码来解析 NSString:

    NSString *string = @"{{nat fs g player|no=1|pos=GK|name=[[Hugo Lloris]]|age={{Birth date and age|1986|12|26|df=y}}|caps=73|goals=0|club=[[Tottenham Hotspur F.C.|Tottenham Hotspur]]|clubnat=ENG}}";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\{\{nat fs g player\|no=(.*)\|pos=(.*?)\|name=\[\[(.*?)\]\]\|age=\{\{Birth date and age\|(.*?)\|(.*?)\|(.*?)\|df=y\}\}\|caps=(.*?)\|goals=(.*?)\|club=\[\[(.*?)\|(.*)"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];

NSArray *matches = [regex matchesInString:string
                                  options:0
                                    range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches) {
    NSString *a = [string substringWithRange:[match rangeAtIndex:0]];
    NSString *b = [string substringWithRange:[match rangeAtIndex:1]];
    NSString *c = [string substringWithRange:[match rangeAtIndex:2]];
    NSString *d = [string substringWithRange:[match rangeAtIndex:3]];
    NSString *e = [string substringWithRange:[match rangeAtIndex:4]];
    NSString *f = [string substringWithRange:[match rangeAtIndex:5]];
    NSString *g = [string substringWithRange:[match rangeAtIndex:6]];
    NSString *h = [string substringWithRange:[match rangeAtIndex:7]];
    NSString *i = [string substringWithRange:[match rangeAtIndex:8]];
    NSString *j = [string substringWithRange:[match rangeAtIndex:9]];
    NSString *k = [string substringWithRange:[match rangeAtIndex:10]];
}

使用这段代码我确实得到了数据,但是当我试图用相同的模式拆分 2 个字符串时:

NSString *string = @"{{nat fs g player|no=1|pos=GK|name=[[Hugo Lloris]]|age={{Birth date and age|1986|12|26|df=y}}|caps=73|goals=0|club=[[Tottenham Hotspur F.C.|Tottenham Hotspur]]|clubnat=ENG}}{{nat fs g player|no=16|pos=GK|name=[[Steve Mandanda]]|age={{Birth date and age|1985|3|28|df=y}}|caps=21|goals=0|club=[[Olympique de Marseille|Marseille]]|clubnat=FRA}}";

我只有一场比赛,知道为什么吗?

您需要修复正则表达式以允许部分匹配。

由于记录以}}结尾,所以在最后一个捕获组中使用惰性(.*?\}\})

正则表达式声明为:

NSString *pattern = @"\{\{nat fs g player\|no=([^|]*)\|pos=([^|]*)\|name=\[\[([^|]*)\]\]\|age=\{\{Birth date and age\|([^|]*)\|([^|]*)\|([^|]*)\|df=y\}\}\|caps=([^|]*)\|goals=([^|]*)\|club=\[\[([^|]*)\|(.*?\}\})";

IDEONE demo