使用NSPredicate不精确/类似匹配过滤NSArray?

时间:2014-02-16 22:38:57

标签: ios objective-c nsarray nspredicate

我有一个包含5个NSArrays的NSArray,每个NSArray都包含NSDictionaries。字典只包含字符串。我正在尝试使用NSPredicate来过滤掉特定的词典,但它似乎只能使用完全匹配。我希望它忽略任何标点符号,例如:-。这就是我目前所拥有的。

NSString *seriesTitle = @" Fullmetal Alchemist Brotherhood - ";
NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:
                                   @"series_title CONTAINS[cd]%@", seriesTitle];
NSArray *filtered = [arraytoEvaluate filteredArrayUsingPredicate:titlePredicate]

在“arraytoEvaluate”中是包含此键值对@"series_title" : @"Fullmetal Alchemist: Brotherhood"的NSDictionary。这是我想要它匹配的那个。即使我正在请求[cd]搜索,我的谓词也没有选择它,我相信它会忽略标点符号/空格,对吗?

使用series_title LIKE[cd]%@让我崩溃了:

'NSInvalidArgumentException', reason: 'Can't do regex matching on object

使用BEGINSWITH代替我: 'NSInvalidArgumentException', reason: 'Can't do a substring operation with something that isn't a string

如果我准确传入字符串,它会拾取它并给我包含包含匹配字典的数组,但前提是搜索项完全匹配。

此外,它将给我所有这些,而不是包含包含匹配的单个NSDictionary的NSArray。我不知道该怎么做。我知道filteredArrayUsingPredicate应该返回一个数组,但是我需要遍历该数组以查找包含搜索项匹配项的特定NSDictionary。然而,这是次要问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

你有两个问题(a)匹配错误,(b)你有嵌套数组。

(a)[cd]表示忽略案例和变音符号,而不是标点符号和空格。这里的解决方案是使用正则表达式并使用MATCHES[CD]作为谓词。您需要一个与您要查找的术语相匹配的正则表达式。基本要点是:

@"fullmetal[^a-z]*alchemist[^a-z]*brotherhood"

其中[^a-z]*匹配每个字符集*中的零个或多个([...])个字符,而不是^个字母a-z

虽然这有效但它可能比您希望的要多得多 - 您应该优化正则表达式。

(b)您得到的错误Can't do regex matching on object...是因为您无法将正则表达式与数组匹配,并且数组的元素本身就是数组。您可以使用元素上的简单循环来解决这个问题,这些内容类似于:

NSMutableArray *filtered = [NSMutableArray new];                                          // allocate an empty mutable array in which to accumulate the matches
for(NSArray *subArray in arraytoEvaluate)                                                 // loop over each sub array
   [filtered addObjectsFromArray:[subArray filteredArrayUsingPredicate: titlePredicate]]; // and perform the predicate

HTH