考虑以下数组:
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的字符串以匹配此表达式。
我已针对以下网站检查了正则表达式,该网站可以正常运行:
我在Xcode(6.4,6E35b)中没有针对iOS 8.4 iPhone 6 Plus模拟器运行的警告/错误,但为什么我的正则表达式没有按预期过滤?
答案 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];