2012-07-22 10 views
23

ich ein NSPredicate wie dieses:NSPredicate Exact Match mit String

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

Aber das wird alles zurück, die die Zeichenfolge enthält. Zum Beispiel: Wenn mein entity.name wo ist:

text 
texttwo 
textthree 
randomtext 

und die myStringtext war dann all diese Strings würde passen. Ich möchte es so, dass, wenn myStringtext ist, es nur das erste Objekt mit dem Namen text zurückgeben würde und wenn myStringrandomtext wäre, würde es das vierte Objekt mit dem Namen randomtext zurückgeben. Ich suche auch für ihn Fall unempfindlich zu sein und dass es ignoriert Leerzeichen

Antwort

54

Dies sollte es tun:

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

LIKE Matches Strings mit? und * als Wildcards. Die [c] zeigt an, dass der Vergleich Groß-und Kleinschreibung nicht beachten sollte.

Wenn Sie nicht wollen? und * wird als Platzhalter behandelt, Sie == statt LIKE verwenden:

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

Mehr Informationen im NSPredicate Prädikat Format String Syntax documentation.

+0

Wird Whitespace ignoriert? – CoreCode

+0

Ahh, tut mir leid, ich habe diesen Teil verpasst. Ich denke, für die Leerraumunempfindlichkeit müssen Sie MATCHES verwenden und einen regulären Ausdruck anstelle einer einfachen Match-Zeichenfolge bereitstellen. dasblinkenlight's Antwort zeigt dies. –

12

können Sie regelmäßig verwenden Ausdruck Matcher mit dem Prädikat, wie folgt aus:

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

Das Stück Code oben konstruiert einen regulären Ausdruck, die Strings mit optionalen Leerzeichen am Anfang und/oder am Ende übereinstimmt, mit das Zielwort umgeben von den "Wortgrenzen" -Markern \b. Die [c] nach matches bedeutet "Groß-und Kleinschreibung nicht übereinstimmen".

In diesem Beispiel wird ein Array von Strings verwendet. Damit es in Ihrer Umgebung funktioniert, ersetzen Sie SELF durch entity.name.