带有核心数据的 NSPredicate,在字符串属性中搜索带有边界的单词

Posted

技术标签:

【中文标题】带有核心数据的 NSPredicate,在字符串属性中搜索带有边界的单词【英文标题】:NSPredicate with core data, search word with boundaries in string attribute 【发布时间】:2015-01-23 07:27:44 【问题描述】:

我觉得我的问题的答案可能已经在这个论坛的某个地方,但经过数小时的搜索,我似乎无法完全正确。我以前从未使用过 SQL,所以请多多包涵。

我有一个只有一个实体的核心数据模型,并且该实体有一个名为“定义”的属性(数据库中的每个实体都是一个字典条目)。我想要做的是搜索带有单词边界的输入字符串的定义。如果我使用 NSPredicate 和输入文本进行简单的 CONTAINS[cd] 搜索,我会得到我正在寻找的内容,除了我还会得到包含输入字符序列的定义,而不管边界如何。

所以我也尝试构建一个像@"(?w).*\\btheWord\\b.*" 这样的正则表达式字符串以及MATCHES[cd] 搜索命令,但我阅读了只能在搜索NSStrings 时使用的其他帖子,不管它没有用。

这应该很简单,但我很难过。任何帮助表示赞赏。

编辑:这是我正在做的一个例子

YTAppDelegate * delegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext * context = delegate.managedObjectContext;

NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"YTDictData"];


NSString * searchTerm = [NSString stringWithFormat:@"'(?w).*\\b%@\\b.*'",[NSRegularExpression escapedPatternForString:inputText]];

NSString * searchString = [NSString stringWithFormat:@"definitions contains[cd] %@",searchTerm];

request.predicate = [NSPredicate predicateWithFormat:searchString];

NSError * searchError = nil;

NSArray * searchResults = [context executeFetchRequest:request error:&searchError];

在这种情况下,如果我要搜索单词“hello”,我将找不到匹配项。

但是,如果我不格式化searchString 字符串以进行正则表达式搜索(即searchString = inputString),我将得到包含字符序列“hello”的任何定义。我需要能够找到包含字符串“hello”的字符串,但我还需要添加的约束,我希望“hello”被识别为有边界的单词。

【问题讨论】:

展示你的原始尝试并解释它返回的结果(正确和错误)。 嗨@Wain 感谢您的建议。请看一下修改。 您是否尝试过使用MATCHES 进行正则表达式匹配?请参阅 Apple 的“谓词编程指南”。 @TomHarrington 是的,我有。 MATCHES 搜索也不返回任何结果。 MATCHES 命令是否需要特殊格式?搜索核心数据库时可以使用MATCHES吗?据我了解,正则表达式搜索仅在搜索已经在内存中的 NSString 时才有效。我更愿意利用核心数据内置的 SQL 接口。 根据这个答案:***.com/a/2885731/2128900 可以在获取请求的谓词中使用正则表达式。也许您使用的语法不适用于 SQLite 存储。 【参考方案1】:

正如 cmets 中已经说过的,您必须使用“匹配”运算符 用于正则表达式匹配。此外,您不应该使用 stringWithFormat 构建谓词字符串(您的 searchString 变量)。

它应该是这样工作的:

NSString *searchTerm = [NSString stringWithFormat:@".*\\b%@\\b.*",
            [NSRegularExpression escapedPatternForString:inputText]];
request.predicate = [NSPredicate predicateWithFormat:@"definitions MATCHES[cd] %@",
                                    searchTerm];

【讨论】:

感谢您指出在 [NSPredicate predicateWithFormat:] 方法中直接使用另一个字符串的细微差别 - 事先我必须插入 ' 标记,否则我会收到 SQL 错误。然而,那些' 标记可能已被合并到搜索参数中,这就是我没有找到任何东西的原因。 @Matt:不客气。 – 您方法中的主要问题实际上是“反斜杠-b”。在[NSPredicate predicateWithFormat:searchString] 中,这成为一个退格字符。

以上是关于带有核心数据的 NSPredicate,在字符串属性中搜索带有边界的单词的主要内容,如果未能解决你的问题,请参考以下文章

带有核心数据对象的 NSPredicate

如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?

带有谓词的核心数据获取请求。需要正确的 NSPredicate

带有 NSPredicate 的 NSFetchedResultsController 未更新

NSPredicate - 核心数据 - 比较两个属性

在保存到核心数据之前将字符串与 NSPredicate 进行比较