2012-07-22 15 views
23

Ho un NSPredicate come questo:NSPredicate corrispondenza esatta con String

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

Ma che tornerà tutto ciò che contiene quella stringa. Ad esempio: Se il di mio entity.name dove:

text 
texttwo 
textthree 
randomtext 

e la myString era text poi tutte quelle stringhe sarebbe partita. Mi piacerebbe che se myString fosse text restituisse solo il primo oggetto con il nome text e se myString fosse randomtext restituirebbe il quarto oggetto con il nome randomtext. Sto anche cercando di essere insensibile caso e che ignora gli spazi bianchi

risposta

54

Questo dovrebbe farlo:

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

LIKE partite stringhe con? e * come caratteri jolly. [c] indica che il confronto deve essere senza distinzione tra maiuscole e minuscole.

Se non vuoi? e * di essere trattati come caratteri jolly, è possibile utilizzare al posto di ==LIKE:

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

Maggiori informazioni nel formato NSPredicate predicato String Sintassi documentation.

+0

Ignora gli spazi bianchi? – CoreCode

+0

Ahh, mi dispiace aver perso quella parte. Penso che per l'insensibilità degli spazi bianchi, è necessario utilizzare MATCHES e fornire un'espressione regolare invece di una semplice stringa di confronto. la risposta di dasblinkenlight lo dimostra. –

12

È possibile utilizzare espressioni regolari con il predicato, in questo modo:

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

Il pezzo di codice di cui sopra costruisce un'espressione regolare che corrisponde le stringhe con spazi vuoti opzionali all'inizio e/o alla fine, con la parola target circondata dai marcatori "word boundary" \b. Il [c] dopo il matches significa "corrispondente maiuscole/minuscole".

Questo esempio utilizza una matrice di stringhe; per farlo funzionare nel proprio ambiente, sostituire SELF con entity.name.

Problemi correlati