【问题标题】:iOS Split NSString with Regular ExpressioniOS 用正则表达式拆分 NSString
【发布时间】:2016-02-05 03:48:00
【问题描述】:

我正在使用这段代码来解析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}}";

我只得到了一场比赛,知道为什么吗?

【问题讨论】:

    标签: ios objective-c regex nsregularexpression


    【解决方案1】:

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

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

    正则表达式声明将是:

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

    IDEONE demo

    【讨论】:

    • @Priya 这是另一个问题,在我看来,这个话题太宽泛了。随时发布问题,但不要忘记提供确切的模式要求。没有唯一的地址验证正则表达式。
    • @WiktorStribiżew...我无法验证以下地址: // NSString *strAddress =@"No. 9, Arulambal Street, T. Nagar, Chennai - 600017"; //无效 // NSString *strAddress =@"No. 12, channiah corner, Singaiyanapalya, Next to VR Mall, Mahadevpura, Bengaluru, Karnataka 560048";//无效 我如何验证上述地址
    • @Priya 我怀疑任何人都可以。
    • @Priya 既然没有要求,就匹配任意字符串——(?s)^.*$
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-08-11
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多