NSPredicate与String完全匹配

时间:2012-07-22 03:07:24

标签: objective-c ios core-data nsstring nspredicate

我有这样的NSPredicate:

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

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

text
texttwo
textthree
randomtext

myStringtext,那么所有这些字符串都会匹配。我希望如果myStringtext,它只会返回名为text的第一个对象,如果myStringrandomtext,它将返回第四个名为randomtext的对象。我也在寻找它不敏感的情况,它忽略了空格

2 个答案:

答案 0 :(得分:58)

这应该这样做:

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

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

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

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

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

答案 1 :(得分: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]之后的matches表示“不区分大小写”。

此示例使用字符串数组;要使其在您的环境中正常运行,请将SELF替换为entity.name