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

时间:2015-01-23 07:27:45

标签: ios regex core-data nspredicate

我觉得我的问题的答案可能已经存在于这个论坛的某个地方了,但是经过几个小时的淘汰后,我似乎无法做到这一点。我之前从未使用过SQL,请耐心等待。

我有一个只有一个实体的核心数据模型,该实体有一个名为“definitions”的属性(数据库中的每个实体都是一个字典条目)。我想要做的是搜索带有字边界的输入字符串的定义。如果我使用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”被识别为带边界的单词。

1 个答案:

答案 0 :(得分:3)

正如评论中已经说过的那样,你必须使用" MATCHES"操作者 用于正则表达式匹配。另外,你不应该使用 stringWithFormat来构建谓词字符串(searchString 变量)。

这是它应该如何运作的:

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