2010-08-28 17 views
30

Estoy buscando una solución sobre cómo formatear NSPredicate para buscar la palabra correcta en una cadena de texto. Actualmente estoy usando este código:¿Cómo encontrar la palabra startswith en una cadena usando NSPredicate?

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(content CONTAINS[c] %@)", word]; 

pero vuelve resuls equivocados si la palabra es corta, por ejemplo: si la palabra es 'ail' le proporcione todas las cadenas con palabras que incluyen este 3 letras. . Pero no necesito una búsqueda tan abstracta, entonces ¿cómo buscar palabras 'comienza con' mi palabra en una cadena?

Respuesta

56

Simplemente use BEGINSWITH en lugar de CONTAINS.

Editar

Si es necesario buscar en cada palabra de una cadena, no es una técnica que se presentó en una de las conversaciones en la WWDC 2010. La idea básica es crear una entidad separada, que Word contiene una sola palabra y una referencia del objeto que lo contiene (la entidad que está buscando). A continuación, realice la búsqueda en la entidad Word y devuelva los objetos que están relacionados con las palabras encontradas.

La consulta sería entonces algo como esto (siempre que tenga una relación muchos-a-uno entre su entidad y Word: "Cualquier palabra BEGINSWITH [c]% @"

Esto significaría que usted tiene que configuración de las palabras al crear sus objetos sin embargo.

+0

Gracias por su tiempo, pero estoy hablando de una cadena, no una palabra. Si voy a usar startswith, devolverá todas las cadenas que comiencen con mi palabra, pero necesito devolver las cadenas que contengan palabras, comienza con mi palabra ... – azia

+0

Entonces, lo que necesitas es algo así como "cualquier palabra en el contenido comienza con XX" ? – Alfonso

+0

Sí, algo como esto. Pero debería devolver una cadena completa. Lo que pasa es que necesito encontrar en las recetas de Núcleo Datos con uno de los ingredientes por título de la receta. Por ejemplo, si busco apple, necesito encontrar recetas con el título 'Fuji Apples Tarte Tatin'. – azia

18

búsqueda primero con BEGINSWITH para "Foo", esto te encontrará el comienzo de una cadena de

"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2) 

y que CONTAINS para "Foo" (no e el espacio antes de Foo), el cual le dará las palabras que comienza con "Foo" presidido con un espacio

"Word1 Foo Word", "Some OtherWord FooWord", "Misc FooXWord" (will find 3) 

predicado:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(content BEGINSWITH[c] %@) OR (content CONTAINS[c] %@)", word, [NSString stringWithFormat:@" %@", word]]; 
+1

Eso es lo que quiero ... varían la respuesta inteligente ... Gracias amigo – guru

6

Si el texto contiene algunos caracteres de puntuación entre las palabras que usted puede usar este predicado:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
           @"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)", 
           query, 
           [NSString stringWithFormat:@".*[^\\w]%@.*", query]]; 
+0

¡Guau! Pensé que tokenar era la única solución hasta que vi esto. – 8suhas

+1

He actualizado la solución. Sin puntuación ahora es necesario. –

7

que he tenido el mismo tema y al principio pensé que sus respuestas me podría ayudar, pero no lo hicieron. Éste me ayudó, así que ... Tome un vistazo:

NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText]; 
NSString *predicateString = @"keyword MATCHES[c] %@"; 
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString]; 
0

Trate de usar el compuesto:

NSCompoundPredicate *bPredicate =  [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]]; 
Cuestiones relacionadas