我有这样的NSPredicate:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name CONTAINS %@", myString];
但是这将返回包含该字符串的任何内容。例如: 如果我的entity.name在哪里:
text
texttwo
textthree
randomtext
且myString
为text
,那么所有这些字符串都会匹配。我希望如果myString
为text
,它只会返回名为text
的第一个对象,如果myString
为randomtext
,它将返回第四个名为randomtext
的对象。我也在寻找它不敏感的情况,它忽略了空格
答案 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
。