我们使用下面的NSPredicate
从CoreData
中获取实体:
[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)