这必须是重复的。但由于存在如此多的NSPredicate问题,我找不到合适的问题。
我有一个包含compositeName
字段的Core Data对象列表。像'Emily Blunt'这样的名字就在那里。我想使用NSPredicate
搜索列表,让我搜索“Em”,但也搜索“Bl”,然后在获取的结果中显示此名称。
这一定非常简单,但正如你猜测的那样,我没有看到它。我在使用正则表达式的NSPredicate中的不正常尝试看起来像这样:
[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query];
我对这个正则表达式的想法是:
但它不起作用。我没有得到任何结果。我该如何解决这个问题?
P.S。如果有一个没有正则表达式的NSPredicate解决方案也适合我的目的。
答案 0 :(得分:16)
您需要在谓词字符串之外构建整个正则表达式模式字符串,然后将其传递给谓词。
此外,还有一个正则表达式构造\b
来匹配单词边界,这就是你所追求的。
总而言之,这段代码应该为您提供一个解决问题的简单方法:
NSString *searchString = @"Em";
NSString *regexString = [NSString stringWithFormat:@".*\\b%@.*", searchString];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];
如果尚未清除输入搜索文本,您可能希望在将其传递给正则表达式引擎之前执行此操作。
另一个改进可能是在字边界接受unicode字符,以便人们搜索'Ántonio','Über'和其他类似的字符串。
以下代码行将创建一个正则表达式模式,它将处理这两个方面:
NSString *orgSearchString = @"^";
NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];
NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];