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

Posted

技术标签:

【中文标题】如何转义 NSPredicate 格式字符串中的尾部反斜杠【英文标题】:How to escape a trailing backslash in an NSPredicate format string 【发布时间】:2013-05-11 01:49:07 【问题描述】:

我正在使用 Core Data,并且在 fetch 请求中有这样的谓词:

NSString *predicateStr = [NSString stringWithFormat:@"name like[c] '%@'",name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateStr];

这很好用,但有一个例外: 有时名称可能以反斜杠 ("\") 结尾,因为该部分是用户生成的,也可能来自应用程序外部。

当它发生时,我收到如下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因: '无法解析格式字符串“(name like[c] 'mqcu\')”'

所以我尝试像这样使用stringByReplacingOccurrencesOfString

NSString *predicateStr = [NSString stringWithFormat:@"(name like[c] '%@')", [name stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]];

然后我收到这样的错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因: '反斜杠是一个通配符,不能在字符串的末尾出现未转义。'

如何正确转义反斜杠?

【问题讨论】:

请尽量复制您的实际代码。第一行无法编译,并且在谓词字符串中用引号将%@ 括起来根本不起作用。 感谢更正,实际代码远不止这些。我应该更加小心,不要遗漏引号。 希望你没有使用stringWithFormat来构建谓词...? 我这样做了,因为谓词的某些部分可能会根据一些项目而改变!让我试着把一个换成静态的...... 如果您作为答案发布,我会接受...我还将编辑我的问题以包含我最初所做的事情。 【参考方案1】:

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

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

【讨论】:

ty 用于 NSCompoundPredicate【参考方案2】:

根据您的需求,您可以使用 ==、BEGINSWITH、CONTAINS 等而不是 LIKE 来构建您的谓词。这样你就不用担心转义特殊字符了。

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

【讨论】:

以上是关于如何转义 NSPredicate 格式字符串中的尾部反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 'IN' 运算符在 swift 中的格式问题。无法解析格式字符串

ios:使用 NSPredicate 检查正则表达式 - 无法解析格式字符串

如何使用 NSPredicate 在字符串中查找开头的单词?

JQuery .ajax 返回json格式,浏览器显示带有转义字符问题

万变不离核心基础第九关——转义符的使用/使转义符失效/保持字符串原始格式

如何转义字符串中的特定 HTML 标签