所以我正在尝试搜索核心数据。假设我的CoreData
有两个字段NSString
(我们称之为foo& bar)。用户指示要搜索的字段和搜索字符串。现在我正在使用这段代码:
NSString *format = [NSString stringWithFormat:@"(%@ matches[c] %@)", field, @"%@"];
// Double-escape that slash
NSString *pattern = [NSString stringWithFormat:@".*\\b%@.*", partialString];
NSPredicate *predicate = [NSPredicate predicateWithFormat:format, pattern];
[fetchRequest setPredicate:predicate];
字段作为“foo”或“bar”传入。部分字符串是搜索字符串。如果bar包含“Grand Poobah”,我希望它匹配“Poo”是查询字符串(但不是当它是“oobah”时,这就是为什么我在正则表达式中有\ b)。
但我遇到的问题是,如果有人提出“Poo”的查询,那么它会崩溃,因为它会被解释为regex
的一部分。
在构建模式之前,是在partString中简单地转义所有特殊字符的最佳途径吗?或者我还有其他方法可以构建谓词吗?
答案 0 :(得分:7)
是的,你应该转义搜索字符串中的所有特殊字符,并且有一个 这样做的简单方法:
NSString *escapedString = [NSRegularExpression escapedPatternForString:partialString];
NSString *pattern = [NSString stringWithFormat:@".*\\b%@.*", escapedString];
但是你不应该使用stringWithFormat
来构建一个谓词格式字符串(如你的那样)
第一行)。只需继续
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES[c] %@", field, pattern];
请注意,%K
谓词格式必须用于密钥路径替换。