用户输入的键在使用 NSPredicate MATCH 获取 CoreData 实体时会中断正则表达式



我们使用下面的NSPredicateCoreData中获取实体:

[NSPredicate predicateWithFormat:@"name MATCHES[cd] %@", [NSString stringWithFormat:@"^%@.*|.*[-\s.@]%@.*", userInputtedKey, userInputtedKey]];

例如,如果userInputtedKey只包含字母和数字,一切就会顺利进行。但是,如果userInputtedKey本身包含正则表达式的保留符号,则匹配将失败甚至崩溃。

例如,userInputtedKey as @"("将导致崩溃:

由于

未捕获的异常"NSInternalInconsistencyException"而终止应用程序,原因:"无法进行正则表达式匹配, 原因:无法打开图案U_REGEX_MISMATCHED_PAREN(字符串Yu, 模式 ^(.|.[-\s.@](.*,案例 1,佳能 2)'

userInputtedKey的内容是我无法控制的;它可以是用户输入的任何内容。是否可以让系统不解析保留符号(如果有的话userInputtedKey,只是将userInputtedKey视为一个整体进行匹配?有点像引用''

终于找到了一个优雅的解决方案,那就是: userInputtedKey = [NSRegularExpression escapedPatternForString: userInputtedKey];

遇到同样的问题。迅捷 4 版本:

let safeUserInputtedKey = NSRegularExpression.escapedPattern(for: userInputtedKey)

最新更新