Вопрос по objective-c – NSP предикат, который игнорирует пробелы

7

Мне нужно использовать NSPredicate для сопоставления двух строк, без учета регистра, без учета диакритических знаков,and whitespace-insensitive.

Предикат будет выглядеть примерно так:

[NSPredicate predicateWithFormat:@"Key ==[cdw] %@", userInputKey];

'W' модификатор изобретен для выражения того, что я хотел бы использовать.

Я не могу просто обрезатьuserInputKey потому что источник данных & quot; ключ & quot; значения также могут содержать пробелы (им нужны эти пробелы, я не могу просто обрезать их заранее).

Например, учитываяuserInputKey & Quot; аЬс & Quot; предикат должен соответствовать всем

{"abc", "a b c", " a B    C   "}
 и так далее. УчитываяuserInputKey«B C»; предикат также должен соответствовать всем значениям в наборе выше.

Это не так сложно сделать, не так ли?

Ваш Ответ

2   ответа
11

+ (NSPredicate *)myPredicateWithKey:(NSString *)userInputKey {
    return [NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedString, NSDictionary *bindings) {
        // remove all whitespace from both strings
        NSString *strippedString=[[evaluatedString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
        NSString *strippedKey=[[userInputKey componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
        return [strippedString caseInsensitiveCompare:strippedKey]==NSOrderedSame;
    }];
}

Тогда используйте это так:

NSArray *testArray=[NSArray arrayWithObjects:@"abc", @"a bc", @"A B C", @"AB", @"a B d", @"A     bC", nil];
NSArray *filteredArray=[testArray filteredArrayUsingPredicate:[MyClass myPredicateWithKey:@"a B C"]];               
NSLog(@"filteredArray: %@", filteredArray);

Результат:

2012-04-10 13:32:11.978 Untitled 2[49613:707] filteredArray: (
    abc,
    "a bc",
    "A B C",
    "A     bC"
)
Мне пришлось искатьstackoverflow.com/questions/3543208/… потому что я хотел использовать предикат с NSFetchRequest, но в остальном ваше решение работало прекрасно. Спасибо! JiaYow
1

Swift 4:

    return NSPredicate(block: { (evel, binding) -> Bool in
        guard let str = evel as? String else {return false}
        let strippedString = str.components(separatedBy: CharacterSet.whitespaces).joined(separator: "")
        let strippedKey = id.components(separatedBy: CharacterSet.whitespaces).joined(separator: "")
        return strippedString.caseInsensitiveCompare(strippedKey) == ComparisonResult.orderedSame
    })
}

Пример:

let testArray:NSArray =  ["abc", "a bc", "A B C", "AB", "a B d", "A     bC"]
let filteredArray = testArray.filtered(using: ignoreWhiteSpacesPredicate(id: "a B C")) 

Результат:

["abc", "a bc", "A B C", "A bC"]

Похожие вопросы