24

我有一个这样的 NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name CONTAINS %@", myString];

但这将返回包含该字符串的任何内容。例如:如果我的 entity.name 在哪里:

text
texttwo
textthree
randomtext

然后所有这些字符串都会匹配myStringtext我想要这样 if myStringistext它只会返回带有 name 的第一个对象, textif ismyString它会返回带有 namerandomtext的第四个对象randomtext。我也在寻找它不区分大小写并且它忽略空格

4

2 回答 2

64

这应该这样做:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString];

LIKE用 ? 匹配字符串 和 * 作为通配符。表示比较[c]应该不区分大小写。

如果你不想?和 * 被视为通配符,您可以使用==代替LIKE

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString];

NSPredicate 谓词格式字符串语法文档中的更多信息。

于 2012-07-22T03:17:20.493 回答
13

您可以将正则表达式匹配器与谓词一起使用,如下所示:

NSString *str = @"test";
NSMutableString *arg = [NSMutableString string];
[arg appendString:@"\\s*\\b"];
[arg appendString:str];
[arg appendString:@"\\b\\s*"];
NSPredicate *p = [NSPredicate predicateWithFormat:@"SELF matches[c] %@", arg];
NSArray *a = [NSArray arrayWithObjects:@" test ", @"test", @"Test", @"TEST", nil];
NSArray *b = [a filteredArrayUsingPredicate:p];

上面的这段代码构造了一个正则表达式,它匹配开头和/或结尾带有可选空格的字符串,目标单词被“单词边界”标记包围\b[c]after的matches意思是“不区分大小写匹配”。

这个例子使用了一个字符串数组;要使其在您的环境中工作,请替换SELFentity.name.

于 2012-07-22T03:29:05.750 回答