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?
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.
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]];
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];
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]];
Essayez d'utiliser un composé:
NSCompoundPredicate *bPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]];