iOS NSPredicate 包含来自索引

iOS NSPredicate Contains from an index

我有一个 NSArray 这样的:"test01_asdf","test01_efgh","test02_ghjk"。 我需要使用 NSPredicate 包含过滤这些项目,但我必须将过滤操作范围限制为第 7 个字符之后的所有字符。
我的意思是:忘记 "testNN_" 部分,仅对其余字符串("asdf"、"efgh"、"ghjk")使用包含过滤器。 因此,如果搜索文本是 "e",它只会 return "test01_efgh" 而不是所有项目,因为它们都包含单词 "test" 中的 "e"。 我是一个接收此输入并必须给出该输出的黑匣子。

现在我有这条线:

NSPredicate *predicateFilter = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", [myfilterstring lowercaseString]];

构造另一个数组,使用 substring 将这些元素切碎,对其进行您想要的操作,并利用它的 ids 或元素编号在原始数组中使用,希望这有帮助。

鉴于你是一个块盒,只需要提供输出,我不确定你为什么要使用NSPredicate。在没有 NSPredicate 的情况下,有许多更方便的方法可以解决这个问题。

但由于 NSPredicate 可以采用任意测试块,您可以编写一个谓词来解决这个问题;您不限于内置语言:

import Foundation

func filterArray(array: [String]) -> [String] {
    let predicate = NSPredicate { (value, _) -> Bool in
        let string = value as! NSString
        if string.length > 7 {
            return string.substringFromIndex(7).containsString("e")
        }
        return false
    }

    var matches: [String] = []
    for value in array {
        if predicate.evaluateWithObject(value) {
            matches.append(value)
        }
    }
    return matches
}

let array = ["test01_asdf","test01_efgh","test02_ghjk"]
print(filterArray(array))

使用 MATCHES 而不是 CONTAINS

NSArray *a = @[ @"test_abc", @"test_def" ];

NSString *search = [NSString stringWithFormat:@".*_.*%@.*", @"c"];

NSLog(@"%@", [a filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF MATCHES %@", search]]);

以上代码打印:test_abc