web-dev-qa-db-fra.com

Comment trouver commence avec Word dans une chaîne utilisant NSPredicate?

Je cherche une solution sur la façon de formater NSPredicate pour rechercher Word correct dans une chaîne de texte. Actuellement, j'utilise ce code:

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

mais si le mot est court, le résultat est mauvais, par exemple: si le mot est 'ail', il renverra toutes les chaînes contenant des mots comportant ces 3 lettres. 'commence avec' ma Parole dans une chaîne?

34
azia

Utilisez simplement BEGINSWITH au lieu de CONTAINS.

Modifier

Si vous devez rechercher dans chaque mot d'une chaîne, il existe une technique qui a été présentée dans l'un des exposés de la WWDC 2010. L'idée de base est de créer une entité distincte Word contenant un mot unique et une référence de l'objet contenant (l'entité que vous recherchez). Vous effectuez ensuite la recherche sur l'entité Word et renvoyez les objets associés aux mots trouvés.

La requête ressemblerait alors à quelque chose comme ceci (à condition que vous ayez une relation plusieurs-à-un entre votre entité et Word: "TOUT mot commençant par [c]% @"

Cela voudrait cependant dire que vous devez configurer les mots lors de la création de vos objets.

60
Alfonso

cherchez d'abord avec BEGINSWITH pour "Foo", cela vous fera découvrir les débuts d'une chaîne

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

et que CONTAINS pour "Foo" (notez l’espace avant Foo), ce qui vous donnera des mots commençant par "Foo" précédés d’un espace

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

Prédicat:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content BEGINSWITH[c] %@) OR (content CONTAINS[c] %@)", Word, [NSString stringWithFormat:@" %@", Word]];
19
Peter Lapisu

J'ai eu le même problème et au début, je pensais que vos réponses pourraient m'aider, mais ce n'est pas le cas. Celui-ci m'a aidé, alors ... Regardez:

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

Si votre texte contient des caractères de ponctuation entre les mots, vous pouvez utiliser ce prédicat:

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

Essayez d'utiliser un composé:

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