NSPredicate 在包含数字和字母的字符串中包含搜索
Posted
技术标签:
【中文标题】NSPredicate 在包含数字和字母的字符串中包含搜索【英文标题】:NSPredicate contains search in a string that contains number and letters 【发布时间】:2012-10-15 15:54:53 【问题描述】:我必须使用NSPredicate
来搜索一些核心数据对象。但是自定义对象的键 name
可以同时包含数字和字母。
该字符串可能类似于:John 1234 Lennon
或Ringo Starr
。
我通常会使用谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",searchString];
但是,如果我搜索John Lennon
,谓词不会返回任何内容,因为它无法比较它是否包含字符John Lennon
,因为缺少1234
。任何提示我可以使用哪种谓词?
【问题讨论】:
【参考方案1】:您可以标记您的查询,可能就像
NSArray *tokens = [querystring componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
然后构造一个复合谓词。
NSMutableArray *predarray = [NSMutableArray array];
for(NSString *token in tokens)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",token];
[predarray addObject:predicate];
NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:predarray];
并将其提供给您的查询
在现实生活中,我会对每个令牌进行一些验证,以检查它是否会生成有效的谓词并且不会崩溃或产生安全风险。例如剥离特殊字符,如“* []”
编辑:更正谓词类型以处理问题情况。
【讨论】:
当我将 NSCompoundPredicate 更改为andPredicateWithSubPredicates
时,它就像一个魅力。因为orPredicateWithSubPredicates
会给出ANY name CONTAINS[cd] John OR ANY name CONTAINS[cd] Lennon
。在一个可能有很多选择的大型数据库中。但 AND 只会给我一个。
这太棒了!谢谢【参考方案2】:
尝试使用 LIKE 代替 contains,然后您可以使用通配符,例如 John*Lennon 应匹配以 John 开头并以 Lennon 结尾且其间包含任意数量其他字符的字符串。您可以使用 ?相反,如果您想更好地控制匹配的内容,每个问号只会匹配一个字符。
【讨论】:
【参考方案3】:您可以将搜索字符串拆分为字符串数组,然后切换谓词以查找名称中的任何字符串:
NSArray *strings = [searchString componentsSeparatedByString:@" "];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY %@ IN name",strings];
【讨论】:
有了这个谓词找不到任何东西。我也试过"ANY name IN %@",strings
,但没用。以上是关于NSPredicate 在包含数字和字母的字符串中包含搜索的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 检查以逗号分隔的一串数字是不是包含数字