NSPredicate匹配任何字符

squ*_*rog 9 iphone objective-c nspredicate

如何构建一个NSPredicate,在Arrays对象中的任何位置查找搜索项?我不能很好地解释它,所以这是一个例子.

NSArray *array = @[@"Test String: Apple", @"Test String: Pineapple", @"Test String: Banana"];
NSString *searchText = @"Apple";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"filteredArray: %@", filteredArray);

// filteredArray: (
//    "Test String: Apple",
//    "Test String: Pineapple"
// )
Run Code Online (Sandbox Code Playgroud)

但如果我使用NSString *searchText = @"Test Str Appl";我得到零结果.我希望它匹配此字符串的相同结果.

我正在寻找的是一个搜索功能,类似于在Xcode中,"快速打开"菜单,如果你的搜索字符串正确的措辞,只有字母是按照正确的顺序作为搭配也没关系.我真的希望这是有道理的.

快速打开菜单

Mar*_*n R 20

LIKE谓词字符串比较允许通配符*?,其中*匹配0或多个字符.因此,如果您将搜索文本转换为

NSString *searchWithWildcards = @"*T*e*s*t* *S*t*r*A*p*p*l*";
Run Code Online (Sandbox Code Playgroud)

通过*使用类似的东西在开头,所有字符之间和原始搜索文本的末尾插入一个

NSMutableString *searchWithWildcards = [NSMutableString stringWithFormat:@"*%@*", self.searchField.text];
if (searchWithWildcards.length > 3)
    for (int i = 2; i < self.searchField.text.length * 2; i += 2)
        [searchWithWildcards insertString:@"*" atIndex:i];
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

[NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchWithWildcards];
Run Code Online (Sandbox Code Playgroud)

谓词按给定顺序搜索字符,并在它们之间使用任意其他字符.


例如,可以使用以下代码完成转换:

NSMutableString *searchWithWildcards = [@"*" mutableCopy];
[searchText enumerateSubstringsInRange:NSMakeRange(0, [searchText length])
                   options:NSStringEnumerationByComposedCharacterSequences
                usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                    [searchWithWildcards appendString:substring];
                    [searchWithWildcards appendString:@"*"];
                }];
Run Code Online (Sandbox Code Playgroud)