NSPredicate匹配字符串与括号时崩溃

时间:2015-03-11 21:31:52

标签: ios objective-c iphone nspredicate

当我尝试使用包含括号的字符串运行NSPredicate时,我的应用程序始终崩溃。以下是示例代码:

NSString *myString = @"test)";
NSPredicate *defaultPredicate = [NSPredicate predicateWithFormat:@"title MATCHES[cd] %@", myString];

以下是生成的崩溃日志:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't do regex matching, reason: Can't open pattern U_REGEX_MISMATCHED_PAREN (string test, pattern test), case 1, canon 2)

在我的用例中,人们不应该用括号搜索字符串,所以我可以通过执行类似下面的代码来清理字符串,但这并不优雅。

myString = [[myString stringByReplacingOccurrencesOfString:@"(" withString:@""] stringByReplacingOccurrencesOfString:@")" withString:@""];

任何帮助或线索都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:3)

MATCHES用于正则表达式比较。您的表达式被视为正则表达式。如果你的表达不是一个有效的正则表达式,它将会失败。因此,如果您使用MATCHES,通常不希望未经过滤的用户输入,因为每次使用不完整的正则表达式时它都会失败。

也许其中一个String Comparison会更好。

  

默认情况下,字符串比较是大小写和变音符号敏感的。您可以使用方括号内的关键字符c和d修改运算符,以分别指定大小写和变音符号不敏感,例如firstName BEGINSWITH[cd] $FIRST_NAME

     

<强> BEGINSWITH
  左手表达式以右手表达式开头。

     

<强>包含   左手表达式包含右手表达式。

     

<强>的endsWith
  左手表达式以右手表达式结束。

     

<强> LIKE
  左手表达式等于右手表达式:?和*被允许作为通配符,在哪里?匹配1个字符,*匹配0个或更多个字符。

     

<强>匹配
  根据ICU v3,左手表达式使用正则表达式比较等于右手表达式(有关详细信息,请参阅ICU用户指南中的正则表达式)。

相关问题