使用撇号时无法解析格式字符串 nspredicate 错误

Posted

技术标签:

【中文标题】使用撇号时无法解析格式字符串 nspredicate 错误【英文标题】:Unable to parse the format string nspredicate error when using apostrophe 【发布时间】:2012-11-05 11:04:04 【问题描述】:

在我的搜索框中输入关键字时出现此错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法解析格式 string "(title CONTAINS[c] 'hj'"

我输入任何字符串(在本例中为“hj”)后跟一个撇号(或包含一个撇号) )。没有撇号 - 没有错误。

这就是我所做的:

(void)filter:(NSString*)keyword
    NSString* predicateString = [NSString stringWithFormat:@"(title CONTAINS[c] '%@')", keyword];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
    self.filteredArray = [self.initialArray filteredArrayUsingPredicate:predicate];
 

正如我所说,如果关键字中不包含撇号字符,则代码有效。

【问题讨论】:

【参考方案1】:

萨瓦,试试这个:

(void)filter:(NSString*)keyword
    NSString *keywordWithBackslashedApostrophes = [keyword stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"];
    NSString* predicateString = [NSString stringWithFormat:@"title CONTAINS[c] '%@'", keywordWithBackslashedApostrophes];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
    self.filteredArray = [self.initialArray filteredArrayUsingPredicate:predicate];
 

与您的代码的主要区别在于关键字中的撇号被反斜杠撇号替换。

【讨论】:

【参考方案2】:

我也遇到了这个谓词过滤器的问题,我有像 O'Connor 这样的客户名称,并且查询曾经失败。 Alexey Golikov 建议的解决方案效果很好,但我想知道是否有任何 NSPredicate 类级别的修复。字符串操作始终是一件代价高昂的事情,除非必要,否则您可能不想这样做。

-anoop

【讨论】:

【参考方案3】:

试试看这个answer 你可以像predicateWithFormat 那样做所有事情,不用引号

[NSPredicate predicateWithFormat:@"title CONTAINS[c] '%@'", keyword]

【讨论】:

是的,但是尝试使用单个 predicateWithFormat 来做到这一点,我猜不需要用 stringWithFormat 扩展它【参考方案4】:

问题是当您不需要创建 NSString 时。请注意,我们不需要 NSString 变量,并且我们从 %@ 中删除了撇号。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(title CONTAINS[c] %@)", keyword];

【讨论】:

以上是关于使用撇号时无法解析格式字符串 nspredicate 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用c ++从字符串的开头和后面删除撇号

如何使用c ++从字符串的末尾删除撇号

使用 Python 处理 sql 时的撇号 (') 帮助

Maven 使用 mvn test 版本号时无法解析依赖关系

PHP、SQL、撇号、文本输入

为啥撇号会使 Rails 5.1.5 请求解析崩溃?