我正在使用Core Data,我在获取请求中有这样的谓词:
NSString *predicateStr = [NSString stringWithFormat:@"name like[c] '%@'",name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateStr];
这很好用,有一个例外: 有时,名称可能以反斜杠(“\”)结尾,因为该部分是用户生成的,也可能来自应用程序之外。
如果是这样,我会收到如下错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:
'无法解析格式字符串“(名称如[c]'mqcu \')”'
所以我尝试使用stringByReplacingOccurrencesOfString
这样:
NSString *predicateStr = [NSString stringWithFormat:@"(name like[c] '%@')", [name stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]];
然后我收到这样的错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:
'反斜杠是一个通配符char,并且不能在字符串的末尾显示未转义。'
如何正确地逃避反斜杠?
答案 0 :(得分:3)
您永远不应该使用stringWithFormat
来构建谓词。 stringWithFormat
处理%K
和%@
以及引用与predicateWithFormat
不同,因此组合这些方法很容易失败(如您的情况)。
如果谓词具有可变部分
只有在运行时才知道,您可以使用NSCompoundPredicate
创建复杂谓词
动态地(例如,参见https://stackoverflow.com/a/13481452/1187415)。
答案 1 :(得分:0)
根据您的需求,您可以使用==,BEGINSWITH,CONTAINS等来构建谓词,而不是LIKE。然后你不必担心逃避特殊字符。
如果您使用LIKE或MATCHES,则必须转义特殊字符。