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
. Я также ищу, чтобы он был нечувствительным и что он игнорирует пробелы
Ответы
Ответ 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
.