如何转义 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格式,浏览器显示带有转义字符问题