【问题标题】:Filter NSArray with NSPredicate inexact/similar match?使用 NSPredicate 不精确/相似匹配过滤 NSArray?
【发布时间】:2014-03-16 01:51:23
【问题描述】:

我有一个由 5 个 NSArray 组成的 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 遍历该数组。然而,这是次要问题。任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c nsarray nspredicate


    【解决方案1】:

    你有两个问题(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

    【讨论】:

    • 好的,我知道它是如何工作的。不过我只有一个问题。我只使用NSString *seriesTitle = @" Fullmetal Alchemist Brotherhood - "; 作为这个问题的一个例子,但实际上搜索字符串会有所不同。在这种情况下如何设置正则表达式字符串?我可以做NSString *regex = @"[^a-z]*[^a-z]*"; 但输入字符串在哪里起作用?谢谢。
    • @JosephToronto - 你必须设计一个算法来构造一个正则表达式,它与你需要的灵活性匹配文本。例如。如果您要匹配一系列单词而不管中间的空格或标点符号,那么您的算法可能是提取单词,然后将它们与匹配空格和标点符号的模式连接起来——这基本上是我在你的示例中手工完成的加入模式非常一般!
    • 您是否有任何有关嵌套数组不起作用的文档? > “无法将正则表达式与数组匹配,并且数组的元素本身就是数组”
    • @pkamb - documentationCONTAINSMATCHES 描述为“字符串比较”,即它们对单个字符串进行操作。当您在字典数组上使用filteredArrayUsingPredicate: 时,谓词(有效地)使用NSPredicateevaluateWithObject: 依次应用于每个字典,并且对该字典的键查找返回一个字符串。 (续...)
    • (...cont) 如果您对 字典数组数组 执行相同操作,则将 字典数组 传递给 evaluateWithObject:和对该数组返回的键查找和 字符串数组 - 并且没有记录数组的字符串比较。正如问题所示,一些 运算符给出错误(LIKEMATCHESBEGINSWITH),而其他运算符(CONTAINS)没有错误,但在 无证方式。坚持记录在案的内容。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多