如何在NSPredicate格式字符串中转义尾部反斜杠

时间:2013-05-11 01:49:07

标签: ios objective-c core-data nspredicate

我正在使用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,并且不能在字符串的末尾显示未转义。'

如何正确地逃避反斜杠?

2 个答案:

答案 0 :(得分:3)

您永远不应该使用stringWithFormat来构建谓词。 stringWithFormat处理%K%@以及引用与predicateWithFormat不同,因此组合这些方法很容易失败(如您的情况)。

如果谓词具有可变部分 只有在运行时才知道,您可以使用NSCompoundPredicate创建复杂谓词 动态地(例如,参见https://stackoverflow.com/a/13481452/1187415)。

答案 1 :(得分:0)

根据您的需求,您可以使用==,BEGINSWITH,CONTAINS等来构建谓词,而不是LIKE。然后你不必担心逃避特殊字符。

如果您使用LIKE或MATCHES,则必须转义特殊字符。