Подтвердить что ты не робот

NSPredicate Точное совпадение со строкой

У меня есть NSPredicate, как это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name CONTAINS %@", myString];

Но это вернет все, что содержит эту строку. Например: Если my entity.name где:

text
texttwo
textthree
randomtext

а myString - text, тогда все эти строки будут совпадать. Мне бы хотелось, чтобы if myString был text, он только вернул бы первый объект с именем text, а если myString был randomtext, он вернул бы четвертый объект с именем randomtext. Я также ищу, чтобы он был нечувствительным и что он игнорирует пробелы

4b9b3361

Ответ 1

Это должно сделать это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString];

LIKE соответствует строкам с? и * в качестве подстановочных знаков. [c] указывает, что сравнение должно быть нечувствительным к регистру.

Если вы не хотите? и * для использования в качестве подстановочных знаков, вы можете использовать == вместо LIKE:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString];

Дополнительная информация в синтаксисе строки формата NSPredicate Predicate String documentation.

Ответ 2

Вы можете использовать регулярные выражения с вашим предикатом, например:

NSString *str = @"test";
NSMutableString *arg = [NSMutableString string];
[arg appendString:@"\\s*\\b"];
[arg appendString:str];
[arg appendString:@"\\b\\s*"];
NSPredicate *p = [NSPredicate predicateWithFormat:@"SELF matches[c] %@", arg];
NSArray *a = [NSArray arrayWithObjects:@" test ", @"test", @"Test", @"TEST", nil];
NSArray *b = [a filteredArrayUsingPredicate:p];

Кусок кода выше строит регулярное выражение, которое соответствует строкам с необязательными заготовками в начале и/или в конце, с целевым словом, окруженным маркерами "границы слова" \b. [c] после matches означает "не учитывать регистр-регистр".

В этом примере используется массив строк; чтобы он работал в вашей среде, замените SELF на entity.name.