NSPredicate忽略了逗号?

时间:2012-06-15 22:22:15

标签: objective-c cocoa-touch nspredicate foundation

我已经实现了UISearchDisplayController,允许用户搜索表格。目前我用于搜索的谓词如下,

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];

现在让我们假设用户搜索“beans,cooked”,在表格中找到相应的匹配项。但是,如果用户在没有逗号的情况下将搜索文本输入为“beans cooked”,则不会找到匹配项。

如何在搜索时重新编写谓词以“忽略”逗号?换句话说,如何重新编写它,以便它将“煮熟的豆子”视为“煮熟的豆子”(NO COMMMA)?

3 个答案:

答案 0 :(得分:2)

首先是免责声明:

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

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

无论如何,一种方法可以是在模型对象类中添加一个方法。

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

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

这是一个删除标点符号,重音符号和变音符号的实现:

- (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;
}

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

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.simplifiedName = %@", searchString];

您当然希望使用与清理名称相同的算法来清理搜索字符串,因此将其分解为在两个地方使用的常规方法可能是个好主意。

最后,还可以通过对模型对象类实现类别来添加simplifiedName方法,这样您就不必修改其代码,这在您自动定义对象类的情况下很方便。由Core Data生成的文件。

答案 1 :(得分:1)

这可能有点hacky,但你可以从搜索词中删除逗号。

示例:

searchText = [searchText stringByReplacingOccurrencesOfString:@"," withString:@""];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];

答案 2 :(得分:0)

我发现这类问题的最佳解决方案是在每个项目字典中添加一个具有相同名称的条目,但会删除所有标点符号,逗号,短划线等,如this answer