NSPredicate 在包含数字和字母的字符串中包含搜索

Posted

技术标签:

【中文标题】NSPredicate 在包含数字和字母的字符串中包含搜索【英文标题】:NSPredicate contains search in a string that contains number and letters 【发布时间】:2012-10-15 15:54:53 【问题描述】:

我必须使用NSPredicate来搜索一些核心数据对象。但是自定义对象的键 name 可以同时包含数字和字母。 该字符串可能类似于:John 1234 LennonRingo 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:如何将字符串视为数字?

NSPredicate 检查以逗号分隔的一串数字是不是包含数字

NSPredicate 按数组中包含的第一个字母过滤

CoreData NSPredicate MATCHES 正则表达式

NSPredicate - 使用两个条件进行评估

判断用户注册名是否是符合(数字+字母)的功能实现