我有一个包含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。然而,这是次要问题。任何帮助将不胜感激。
答案 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