web-dev-qa-db-fra.com

Correspondance exacte NSPredicate avec chaîne

J'ai un NSPredicate comme celui-ci:

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

Mais cela retournera tout ce qui contient cette chaîne. Par exemple: si mon entité.nom est où:

text
texttwo
textthree
randomtext

et le myString était text alors toutes ces chaînes correspondraient. Je voudrais que si myString soit text il ne retourne que le premier objet avec le nom text et si myString était randomtext il retournerait le quatrième objet avec le nom randomtext. Je recherche également que ce soit le cas insensible et qu'il ignore les espaces blancs

24
CoreCode

Cela devrait le faire:

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

LIKE correspond aux chaînes avec? et * en tant que caractères génériques. Le [c] indique que la comparaison doit être insensible à la casse.

Si tu ne veux pas? et * pour être traités comme des caractères génériques, vous pouvez utiliser == au lieu de LIKE:

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

Plus d'informations dans la syntaxe de chaîne de format de prédicat NSPredicate documentation .

59
Andrew Madsen

Vous pouvez utiliser la correspondance d'expressions régulières avec votre prédicat, comme ceci:

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];

Le morceau de code ci-dessus construit une expression régulière qui fait correspondre les chaînes avec des espaces facultatifs au début et/ou à la fin, avec le mot cible entouré par les marqueurs "limite de mot" \b. Le [c] après matches signifie "faire la distinction entre les majuscules et les minuscules".

Cet exemple utilise un tableau de chaînes; pour le faire fonctionner dans votre environnement, remplacez SELF par entity.name.

13
dasblinkenlight