NSPredicate 精确匹配

Posted

技术标签:

【中文标题】NSPredicate 精确匹配【英文标题】:NSPredicate for exact match 【发布时间】:2016-06-20 10:17:31 【问题描述】:
 NSArray *arrData = [NSArray arrayWithObjects:
                    @"cloud,country,plant",
                    @"country,cloud,plant",
                    @"country,plant,cloud",
                    @"clouds,country,plant"
                    ,@"country,clouds,plant",
                    nil];

从上面的 NSArray,我想要有“云”这个词的对象

我试过下面的代码

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(self beginswith %@ OR self contains[CD] %@)",@"cloud",@",cloud"];
NSArray *arrResult = [arrData filteredArrayUsingPredicate:predicate];

但它在 arrResult 中给出了所有 5 个对象。但我只需要 3 (0,1,2) 个对象。

【问题讨论】:

数组中的每个对象都是逗号分隔值? 您可以将NSRegularExpressionMATCHES 谓词一起使用,并在字符串末尾搜索类似云的内容,或在云后跟一个非字母字符。 [NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@+\\W", @"cloud"]; ? @Larme: Getting crash 'Unable to parse the format string "SELF MATCHES[cd] %@+\W"' 【参考方案1】:

试试:

 NSPredicate* predicate = [NSPredicate predicateWithBlock:^(NSString* string, NSDictionary* options)

    NSArray* array = [string componentsSeparatedByString:@","];

    return [array containsObject:@"cloud"];

];

【讨论】:

谢谢@AndreyChernukha【参考方案2】:

试试下面的代码,

它会起作用的,

 NSPredicate *hsPredicate = [NSPredicate predicateWithBlock:^BOOL(id  _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) 
        NSArray *sepretArray =[((NSString*)evaluatedObject) componentsSeparatedByString:@","];
        NSPredicate *subPredicate = [NSPredicate predicateWithFormat:@"self == %@",@"cloud"];
        return  ([sepretArray filteredArrayUsingPredicate:subPredicate].count > 0);

    ];
    NSArray *arrResult = [arrData filteredArrayUsingPredicate:hsPredicate];

【讨论】:

【参考方案3】:

这个可以解决问题。但我不知道这是否是有效的方法。

 NSArray *arrData = [NSArray arrayWithObjects:
                    @"cloud,country,plant",
                    @"country,cloud,plant",
                    @"country,plant,cloud",
                    @"clouds,country,plant"
                    ,@"country,clouds,plant",
                    nil];

NSMutableArray *resArray = [[NSMutableArray alloc]init];
for(NSString *tempString in arrData)

    NSArray *cache = [tempString componentsSeparatedByString:@","];
    if([cache containsObject:@"cloud"])
      
        [resArray addObject:tempString];
      

【讨论】:

以上是关于NSPredicate 精确匹配的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 和简单的正则表达式问题

有没有办法在 UITest 中使用 valueForKey 和 NSPredicate?

ios 学习之 NSPredicate 模糊精确查询

NSPredicate 匹配反斜杠

NSPredicate 与字符串完全匹配

将 NSPredicate 与字符串匹配