2012-07-22 11 views
23

Tengo un NSPredicate así:NSPredicate concordancia exacta con la cadena

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

Pero eso va a devolver nada que contenga dicha cadena. Por ejemplo: Si de mi entity.name donde: coincidiría

text 
texttwo 
textthree 
randomtext 

y la myString fue text entonces todas esas cadenas. Me gustaría que si myString es text solo devolvería el primer objeto con el nombre text y si myString fuera randomtext devolvería el cuarto objeto con el nombre randomtext. También estoy buscando para que sea insensible caso y que ignora los espacios en blanco

Respuesta

54

Esto debe hacerlo:

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

LIKE coincidencias con cadenas? y * como comodines. El [c] indica que la comparación debe ser insensible a mayúsculas y minúsculas.

Si no lo desea? y * para ser tratados como comodines, se puede utilizar en lugar de ==LIKE:

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

Más información en el formato NSPredicate predicado cadena Sintaxis documentation.

+0

¿Ignora el espacio en blanco? – CoreCode

+0

Ahh, lo siento, me perdí esa parte. Creo que para la insensibilidad al espacio en blanco, debe usar MATCHES y proporcionar una expresión regular en lugar de una cadena de coincidencia simple. La respuesta de dasblinkenlight demuestra esto. –

12

Puede utilizar coincidencias de expresiones regulares con su predicado, como esto:

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

El trozo de código construye una expresión regular que coincide con las cadenas con espacios en blanco opcionales al principio y/o al final, con la palabra de destino rodeada por los marcadores de "límite de palabras" \b. El [c] después de matches significa "combinar mayúsculas y minúsculas".

Este ejemplo utiliza una matriz de cadenas; para que funcione en su entorno, reemplace SELF con entity.name.

Cuestiones relacionadas