NSPredicate with core data, search word with boundaries in string 属性
NSPredicate with core data, search word with boundaries in string attribute
我觉得我的问题的答案可能已经在这个论坛的某个地方,但经过几个小时的搜索,我似乎不太正确。我以前从未使用过 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" 被识别为具有边界的单词。
如评论中所述,您必须使用 "MATCHES" 运算符
用于正则表达式匹配。此外,您不应使用
stringWithFormat
构建谓词字符串(您的 searchString
变量)。
它应该是这样工作的:
NSString *searchTerm = [NSString stringWithFormat:@".*\b%@\b.*",
[NSRegularExpression escapedPatternForString:inputText]];
request.predicate = [NSPredicate predicateWithFormat:@"definitions MATCHES[cd] %@",
searchTerm];
我觉得我的问题的答案可能已经在这个论坛的某个地方,但经过几个小时的搜索,我似乎不太正确。我以前从未使用过 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" 被识别为具有边界的单词。
如评论中所述,您必须使用 "MATCHES" 运算符
用于正则表达式匹配。此外,您不应使用
stringWithFormat
构建谓词字符串(您的 searchString
变量)。
它应该是这样工作的:
NSString *searchTerm = [NSString stringWithFormat:@".*\b%@\b.*",
[NSRegularExpression escapedPatternForString:inputText]];
request.predicate = [NSPredicate predicateWithFormat:@"definitions MATCHES[cd] %@",
searchTerm];