首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >忽略逗号的NSPredicate?

忽略逗号的NSPredicate?
EN

Stack Overflow用户
提问于 2012-06-16 06:22:15
回答 3查看 1.2K关注 0票数 1

我已经实现了一个允许用户搜索表的UISearchDisplayController。目前我用来搜索的谓词如下:

代码语言:javascript
运行
复制
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];

现在假设用户搜索"beans,cooked“,在表中找到相应的匹配项。但是,如果用户输入的搜索文本是不带逗号的“已煮熟的豆子”,则将找不到匹配项。

如何重写谓词以在搜索时“忽略”逗号?换句话说,我如何重写它,使它将“煮熟的豆子”等同于“煮熟的豆子”(没有COMMMA)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-17 22:22:46

首先是免责声明:

我认为你试图做的是在你的搜索算法中添加一些“模糊性”,看起来你想让你的匹配对用户输入的某些差异不敏感。

谓词(逻辑构造)本质上不是模糊的,因此在问题和所选工具之间存在潜在的阻抗不匹配。

无论如何,一种方法是向您的模型对象类添加一个方法。

在此方法中,您可以清理name字符串,使其仅包含最基本的字符,如数字、ascii字母和空格。

这种方法是完全确定的,它实际上是对象上的只读字符串属性,因此可以用来匹配谓词。

下面是一个删除标点符号、重音符号和变音符号的实现:

代码语言:javascript
运行
复制
- (NSString *)simplifiedName
{
    // First convert the name string to a pure ASCII string
    NSData *asciiData = [self.name dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    NSString *asciiString = [[[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding] lowercaseString];

    // Define the characters that we will allow in our simplified name
    NSString *searchCharacters = @"0123456789 abcdefghijklmnopqrstuvwxyz";

    // Remove anything else
    NSString *regExPattern = [NSString stringWithFormat:@"[^%@]", searchCharacters];

    NSString *simplifiedName = [asciiString stringByReplacingOccurrencesOfString:regExPattern withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, asciiString.length)];

    return simplifiedName;
}

现在,可以使用谓词在简化名称中进行搜索:

代码语言:javascript
运行
复制
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.simplifiedName = %@", searchString];

当然,您可能希望使用用于清理名称的相同算法来清理搜索字符串,因此将其分解为一个通用方法可能是一个好主意,以便在这两个位置使用。

最后,还可以通过在模型对象类中实现一个类别来添加simplifiedName方法,这样您就不必修改它的代码,如果您的对象类是由Core Data在自动生成的文件中定义的,这将非常方便。

票数 2
EN

Stack Overflow用户

发布于 2012-06-16 06:34:34

这可能有点老生常谈,但您可以只删除搜索术语中的逗号。

示例:

代码语言:javascript
运行
复制
searchText = [searchText stringByReplacingOccurrencesOfString:@"," withString:@""];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];
票数 1
EN

Stack Overflow用户

发布于 2012-06-17 01:45:06

对于这类问题,我找到的最佳解决方案是在每个条目字典中实际添加一个条目,该条目具有相同的名称,但将删除所有标点符号、逗号、破折号等,就像在this answer中一样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11058894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档