Ios 当获取与NSPredicate匹配的CoreData实体时,用户输入的键会打断正则表达式

Ios 当获取与NSPredicate匹配的CoreData实体时,用户输入的键会打断正则表达式,ios,regex,core-data,Ios,Regex,Core Data,我们使用下面的NSPredicate从CoreData获取实体: [NSPredicate predicateWithFormat:@"name MATCHES[cd] %@", [NSString stringWithFormat:@"^%@.*|.*[-\\s.@]%@.*", userInputtedKey, userInputtedKey]]; 如果userInputedKey仅包含字母和数字,则一切都会顺利进行。然而,如果userInputedKey本身包含regex的保留符号,则匹

我们使用下面的
NSPredicate
CoreData
获取实体:

[NSPredicate predicateWithFormat:@"name MATCHES[cd] %@", [NSString stringWithFormat:@"^%@.*|.*[-\\s.@]%@.*", userInputtedKey, userInputtedKey]];
如果
userInputedKey
仅包含字母和数字,则一切都会顺利进行。然而,如果
userInputedKey
本身包含regex的保留符号,则匹配将失败,甚至崩溃

例如,
userinputedkey
作为
@”(“
将导致崩溃:

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


userinputedkey
的内容是我无法控制的;它可以是用户输入的任何东西。如果
userinputedkey
中有任何保留符号,是否可以让系统不解析保留符号,只需将
userinputedkey
作为一个整体进行匹配?类似于引用
'

的内容最终找到了一个宽限解决方案,即:
UserInputedKey=[NSRegularExpression escapedPatternForString:UserInputedKey];

遇到了相同的问题。Swift 4版本:

let safeUserInputtedKey = NSRegularExpression.escapedPattern(for: userInputtedKey)