我正在使用NSPredicate通过州和国家列表过滤NSDictionary。
所有数据都以逗号分隔的数组存储:@" Alabama",@" Alaska",@" Arizona",@" Arkansas& #34;,@" California",@" Colorado"等
但是,有两种情况会发生重复。国家"新墨西哥"包含"墨西哥"和"阿肯色州"包含“"堪萨斯”这个词。
这是我用来定义谓词的基本代码。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location contains[c] %@", @"Kansas"];
我如何确保"堪萨斯"没有" Arkansas"? 使用BEGINSWITH或LIKE不起作用,因为列表以其他状态开头。
谢谢!
答案 0 :(得分:4)
让我们看看我是否理解正确。你有一个字典,其中有一个键“Location”,其对象是一个以逗号分隔的状态名称的字符串。听起来你需要一个正则表达式来匹配。
NSString* expr = [NSString stringWithFormat:@"^%1$@.*|.*, %1$@.*", @"Kansas"]
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Location MATCHES[c] %@", expr];
现在,以下是不同示例的表现方式:
@{@"Location": @"Kansas, Arkansas, Alabama"} //Pass
@{@"Location": @"Alabama, Kansas"} //Pass
@{@"Location": @"Arkansas, Alabama"} //Fail
正则表达式^%1$@.*|.*, %1$@.*
测试提供的单词是在字符串的开头还是后跟字符和“,”,它将它放在中间。 %1$@
采用第一个参数,因此可以多次使用它,而不是多次使用相同的字符串。
答案 1 :(得分:1)
这可能有帮助吗?
// If I understood correctly, then your locations in the dictionary are like this
NSString *locations = @"Alabama, Alaska, Arizona, Arkansas";
NSString *trimmedLocations = [locations stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSMutableArray *compoments = [[trimmedLocations componentsSeparatedByString:@","] mutableCopy];
//now in components we have this: @[@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado"]
[compoments filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject isEqualToString:@"Kansas"];
}]];
BOOL match = compoments.count;
if (match) {
//do something with locations...
}
答案 2 :(得分:1)
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Location IN %@", myStatesArray];
答案 3 :(得分:1)
我认为你想要的是完全匹配谓词搜索:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@" Location == [c]%@",@" Kansas"];
我是否错误地理解了您的问题?
答案 4 :(得分:1)
它会起作用:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString];
LIKE匹配字符串?和*作为通配符。 [c]表示比较应该不区分大小写。
如果你不想要?和*被视为通配符,您可以使用==而不是LIKE:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString];
NSPredicate谓词格式字符串语法documentation中的更多信息。
答案 5 :(得分:1)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location matches[c] %@", @"Kansas"];
这必须帮助您解决问题。
答案 6 :(得分:1)
尝试使用predicate
matches
关键字,它会为您提供精确的结果匹配,因此您可以删除谓词中的重复出现,如下所示 -
NSArray *yourArr=@[@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location contains[CD] %@", @"Kansas"];
NSMutableArray *filterdArray=[yourArr filteredArrayUsingPredicate:predicate];
if(filterdArray.count>0)
{
NSLog(@"Invalid State");
}