当我尝试使用包含括号的字符串运行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:@""];
任何帮助或线索都将非常感激。谢谢!
答案 0 :(得分:3)
MATCHES
用于正则表达式比较。您的表达式被视为正则表达式。如果你的表达不是一个有效的正则表达式,它将会失败。因此,如果您使用MATCHES
,通常不希望未经过滤的用户输入,因为每次使用不完整的正则表达式时它都会失败。
也许其中一个String Comparison会更好。
默认情况下,字符串比较是大小写和变音符号敏感的。您可以使用方括号内的关键字符c和d修改运算符,以分别指定大小写和变音符号不敏感,例如
firstName BEGINSWITH[cd] $FIRST_NAME
。<强> BEGINSWITH 强>
左手表达式以右手表达式开头。<强>包含强> 左手表达式包含右手表达式。
<强>的endsWith 强>
左手表达式以右手表达式结束。<强> LIKE 强>
左手表达式等于右手表达式:?和*被允许作为通配符,在哪里?匹配1个字符,*匹配0个或更多个字符。<强>匹配强>
根据ICU v3,左手表达式使用正则表达式比较等于右手表达式(有关详细信息,请参阅ICU用户指南中的正则表达式)。