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

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

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

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

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

【问题讨论】:

    标签: ios nspredicate


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多