NSPredicate Exact Match with String
Solution 1
This should do it:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString];
LIKE
matches strings with ? and * as wildcards. The [c]
indicates that the comparison should be case insensitive.
If you don't want ? and * to be treated as wildcards, you can use ==
instead of LIKE
:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString];
More info in the NSPredicate Predicate Format String Syntax documentation.
Solution 2
You can use regular expression matcher with your predicate, like this:
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];
The piece of code above constructs a regular expression that matches strings with optional blanks at the beginning and/or at the end, with the target word surrounded by the "word boundary" markers \b
. The [c]
after matches
means "match case-insensitively".
This example uses an array of strings; to make it work in your environment, replace SELF
with entity.name
.
CoreCode
Updated on July 18, 2022Comments
-
CoreCode almost 2 years
I have a NSPredicate like this:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name CONTAINS %@", myString];
But that will return anything which contains that string. For example: If my entity.name's where:
text texttwo textthree randomtext
and the
myString
wastext
then all of those strings would match. I would like it so that ifmyString
istext
it would only return the first object with the nametext
and ifmyString
wasrandomtext
it would return the fourth object with the namerandomtext
. I am also looking for it to be case insensitive and that it ignores whitespace