Ecriture d'un NSPredicate pour la requête de text 'CONTAINED_BY'

J'essaye de build une requête d'un magasin de données de kernel qui récupère les valeurs d'atsortingbut d'une entité quand elles se produisent dans la string plus longue;

c'est-à-dire, au lieu de searchr des instances où la valeur de l'atsortingbut contient une string (plus courte):

request.predicate = [NSPredicate predicateWithFormat:@"carBrand contains[c] 'merced'"] 

Je veux find des instances (de l'entité) dont les valeurs d'atsortingbut sont trouvées 'contenues dans' une string arbitraire (plus longue) :

 NSSsortingng* textSsortingng = @"Elaine used to drive Audis, but now owns a Mercedes"; request.predicate = [NSPredicate predicateWithFormat:@"%@ contains[c] carBrand", textSsortingng ]; 

(c'est-à-dire récupérer un tableau contenant des objects avec carBrand = @ "Audi" et carBrand = @ "Mercedes")

Dans mes tentatives, NSPredicate ne semble pas aimer les expressions avec le nom d'atsortingbut sur le côté droit et jette une erreur …

[__NSCFConstantSsortingng countByEnumeratingWithState: objects: count:]: sélecteur non reconnu envoyé à l'instance 0x

… existe-t-il un moyen de build une telle requête avec le nom de l'atsortingbut sur le côté gauche – une requête 'contained_by' , pour ainsi dire?

PS . En cherchant SO, je n'ai trouvé des solutions qu'en divisant le text en mots-composants qui, dans mon scénario, seraient loin d'être idéaux! Est-ce le seul type d'approche viable?

Construisez une string regex avec votre tableau et utilisez MATCHES dans votre prédicat.

 [NSPredicate predicateWithFormat:@"%@ MATCHES '*(Audi|Mercedes)*'", testSsortingng]; 

Pour filterr les voitures en fonction de leur marque:

 NSArray *brands = [@"Audi", @"Mercedes"]; [NSPrediate predicateWithFormat:@"carBrand IN %@", brands]; 

Décidé d'essayer d'implémenter une approche componentsSeparatedBySsortingng pour build un NSCompoundPredicate

 //find alphabetic words omitting standard plurals NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^az]*)([az]+?)(?:s)?\\W+" options:NSRegularExpressionCaseInsensitive error:nil]; //separate with pipe| and split into array NSSsortingng *split = [regex ssortingngByReplacingMatchesInSsortingng:textSsortingng options:0 range:NSMakeRange(0, speciesSsortingng.length) withTemplate:@"$1|"]; NSArray *words = [split componentsSeparatedBySsortingng:@"|"]; //build predicate List NSMutableArray *predicateList = [NSMutableArray array]; for (NSSsortingng *word in words) { if ([word length] > 2) { NSPredicate *pred = [NSPredicate predicateWithFormat:@"brandName beginswith[c] %@", word]; [predicateList addObject:pred]; } } //CarBrand* object; NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"CarBrand" inManagedObjectContext:self.managedObjectContext]; request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateList]; NSError *error =nil; NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error]; 

Cela récupère les instances trouvées dans le text; eg1:

@ "Elaine conduisait Audis, mais possède maintenant une Mercedes";

donne un tableau d'objects dont .brandname = "Audi", "Mercedes", respectivement.

eg2: @ "Parmi les voitures volées, il y avait une Ford Mondeo, une Fiat 500C et une Alfa-Romeo Spyder"

rendements .brandname = "Ford", "Fiat", et "Alfa Romeo" (NB non '-') respectivement.

Je ne suis pas encore en train d'accepter ma propre réponse car elle me semble être une solution de contournement et ne s'étendra pas facilement à (par exemple) l'extraction d'un nom de marque ET, disons, d'un model.

J'espère que quelqu'un aura une meilleure solution!