使用 NSPredicate 过滤 EKEvent

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤 EKEvent【英文标题】:Filtering EKEvent with NSPredicate 【发布时间】:2016-07-09 17:45:06 【问题描述】:

我有一个带有 EKEvents 的 NSArray,我需要过滤到一个干净的列表。

我正在寻找一个 NSPredicate,它可以过滤掉所有“title”属性(即NSString)以数字值 开头的事件。

所以,我想去掉那些看起来像 '123Something''8somethingElse' 但保留 'Anything123' 和当然'speciallyThisOne'

我依靠你的聪明才智,因为我真的不知道从哪里开始,所以也非常感谢你的解释!

【问题讨论】:

【参考方案1】:

NSPredicate 支持正则表达式,提供最方便的字符串过滤方式。

这是一个带有自定义字典数组的示例,它应该也适用于 EKEvent 数组。

正则表达式过滤所有字符串

开始^ 不是有一位或多位数字\\D+ 并忽略字符串.*$ 的其余部分。

因为你没有提到语言,所以这是 Swift:

let array = [["name" : "alpha", "title" : "123Something"],
             ["name" : "beta", "title" : "8somethingElse"],
             ["name" : "gamma", "title" : "Anything123"],
             ["name" : "delta", "title" : "specificallyThisOne"]]


let regex = "^\\D+.*$"
let predicate = NSPredicate(format:"title MATCHES %@", regex)

let filteredArray = (array as NSArray).filteredArrayUsingPredicate(predicate)
print(filteredArray)

在没有NSPredicate 的情况下甚至可以使用原生的filter 函数

let filteredArray =  array.filter  $0["title"]!.rangeOfString(regex, options: .RegularExpressionSearch) != nil 

【讨论】:

谢谢,这(几乎)成功了,但可能是因为我没有正确表达自己。生成的过滤数组应包含“Anything123”并过滤掉“123Something”。这是在某处添加感叹号的问题吗? 对不起,我的错,我修正了正则表达式,它只是大写的 D 而不是 d。 你是英雄!我保证我会开始调查 RegEx。

以上是关于使用 NSPredicate 过滤 EKEvent的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate的使用

使用 NSPredicate 过滤文件路径

使用 NSPredicate 过滤 - 数据类型?

如何使用 NSPredicate 过滤 NSArray

使用 NSPredicate 根据 NSDictionary 键过滤 NSArray

使用 NSPredicate 过滤数组