使用正则表达式和特殊字符搜索核心数据

时间:2014-02-19 21:08:03

标签: ios regex core-data

所以我正在尝试搜索核心数据。假设我的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中简单地转义所有特殊字符的最佳途径吗?或者我还有其他方法可以构建谓词吗?

1 个答案:

答案 0 :(得分:7)

是的,你应该转义搜索字符串中的所有特殊字符,并且有一个 这样做的简单方法:

NSString *escapedString = [NSRegularExpression escapedPatternForString:partialString];
NSString *pattern = [NSString stringWithFormat:@".*\\b%@.*", escapedString];

但是你不应该使用stringWithFormat来构建一个谓词格式字符串(如你的那样) 第一行)。只需继续

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES[c] %@", field, pattern];

请注意,%K谓词格式必须用于密钥路径替换。