NSPredicate与正则表达式古怪

时间:2016-11-03 12:34:07

标签: objective-c regex nspredicate

如果给定句子中包含数组中的任何字符串,我试图在嵌套数组中找到匹配项。

这是我的数组

NSArray *menuItems = @[
                  @[@"beverage", @"drink", @"smoothie", @"coffee", @"juice", @"shakes", @"tea", @"beer"],
                  @[@"breakfast", @"egg", @"omelet", @"bagel", @"yogurt", @"pancake", @"cereal", @"waffle", @"oatmeal", @"parfait", @"yoghurt", @"huevos", @"bacon", @"french toast", @"frittata", @"hash brown", @"muesli", @"quiche"],
                  @[@"omelet", @"brunch", @"pancake", @"waffle", @"huevos", @"bacon", @"blintz", @"sausage", @"casserole", @"crepe", @"egg", @"french toast", @"bacon", @"french toast", @"frittata", @"hash brown", @"muesli", @"quiche", @"salad", @"salmmon", @"soup", @"tartine"],
                  @[@"dessert", @"sweet", @"waffle", @"cake"],
                  @[@"appetizer", @"soup", @"side", @"fruit", @"starter", @"snack", @"bread", @"spread"],
                  @[@"coffee", @"drink", @"beverage", @"espresso", @"cappuccino", @"americano", @"latte", @"macchiato", @"frappuccino", @"flat white"]
                  ];

现在当我搜索一个给定的句子时,我希望将该数组中的任何字符串与句子中与左侧匹配的任何单词匹配。 因此,如果我有一个像“热奶酪芝士”的句子,它应该匹配第二个数组中包含的字符串“bagel”。

我的方法就是这个:

NSString *dishName = [NSString stringWithFormat:@"\\b%@\\w*",@"sentence goes here"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF IN %@", dishName];
NSArray *matchedArray = [menuItems filteredArrayUsingPredicate:predicate];

if (matchedArray.count>0) {
    NSLog(@"found match for dish name:%@",@"sentence");
}
else {
    NSLog(@"Didn't match dish name:%@",@"sentence");
}

现在出现了怪异。 根据正则表达式,我在左侧匹配一个单词边界,所以它不应该从左侧进行通配符匹配。

然而当我的句子是例如:@“烤金枪鱼牛排卷饼(1件)” 它匹配第一个数组中的“tea”字符串,用于单词“Steak”。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

对我来说很愚蠢,我使用的是“IN”比较而不是“MATCHES”(忘记了以前的代码迭代)。

将IN更改为MATCHES解决了它

<强>更新

不,它没有完全解决它,因为它不匹配句子中的单词。 需要将正则表达式更改为:

NSString *dishName = [NSString stringWithFormat:@"\\b%@\\w*",[@"some sentence here" stringByReplacingOccurrencesOfString:@" " withString:@"|"]];

现在它正在按预期工作