NSPredicate不按需要过滤

时间:2015-07-14 19:59:17

标签: ios regex nspredicate

考虑以下数组:

NSArray *dataValues = @[@"Foo[0]", @"Foo[1].bar"];

以下正则表达式模式,谓词和预期输出:

NSString *pattern = @"Foo[0]";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF BEGINSWITH[cd] %@", pattern];
NSArray *results = [dataValues filteredArrayUsingPredicate: predicate];
NSLog(@"matches = %ld", (long)results.count);

按预期在控制台中打印1。如果我们将模式更改为:

NSString *pattern = @"Foo\\[[0-9]\\]";

我希望这会在控制台中打印2,但会打印0。我已经双重转义外部方括号以允许它们被解析,并期望在括号内找到数字0到9的字符串以匹配此表达式。

我已针对以下网站检查了正则表达式,该网站可以正常运行:

  

http://regexr.com/3bcut

我在Xcode(6.4,6E35b)中没有针对iOS 8.4 iPhone 6 Plus模拟器运行的警告/错误,但为什么我的正则表达式没有按预期过滤?

2 个答案:

答案 0 :(得分:1)

您可以根据自己的需求来尝试:

    NSArray *dataValues = @[@"Foo[0]", @"Foo[1].bar"];
    NSString *pattern = @"Foo[*]*";
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF LIKE %@", pattern];
    NSArray *results = [dataValues filteredArrayUsingPredicate: predicate];
    NSLog(@"matches = %ld", (long)results.count);

你可以更基本一些并使用

    NSMutableArray *results = [NSMutableArray array];
    for (NSString *str in dataValues) {
        if ([str rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound) {
            if ([str hasPrefix:@"Foo["]) {
                [results addObject:str];
            }
        }
    }
    NSLog(@"matches = %ld", (long)results.count);

答案 1 :(得分:0)

在用Apple推出TSI之后(好吧,谁用这些东西?)他们说我只需要使用MATCHES而不是BEGINSWITH,这只用于字符串匹配 - 而我是试图匹配正则表达式。

因此我的谓词应该是:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF MATCHES[cd] %@", pattern];