Как найти слово в строке, используя NSPredicate? - PullRequest
34 голосов
/ 28 августа 2010

Я ищу решение о том, как отформатировать NSPredicate для поиска правильного слова в текстовой строке.В настоящее время я использую этот код:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content CONTAINS[c] %@)", word];

, но он возвращает неверные результаты, если слово короткое, например: если слово «ail», оно вернет все строки со словами, которые содержат эти 3 буквы.Но мне не нужен такой абстрактный поиск, так как искать слова «начинается с» моего слова в строке?

Ответы [ 5 ]

60 голосов
/ 28 августа 2010

Просто используйте BEGINSWITH вместо CONTAINS.

Редактировать

Если вам нужно искать в каждом слове строки, есть метод, которыйбыл представлен на одном из выступлений в WWDC 2010. Основная идея заключается в создании отдельной сущности Word, которая содержит одно слово и ссылку на содержащий объект (сущность, которую вы ищете).Затем вы выполняете поиск по сущности Word и возвращаете объекты, связанные с найденными словами.

Тогда запрос будет выглядеть примерно так (при условии, что между вашими отношениями много-к-одному)entity и Word: «ЛЮБЫЕ слова BEGINSWITH [c]% @»

Это означает, что вам придется настраивать слова при создании объектов.

19 голосов
/ 17 января 2013

ищите сначала с BEGINSWITH для "Foo", это найдет вам начало строки

"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2)

, а затем CONTAINS для "Foo" (обратите внимание на пробел перед Foo), которыйдаст вам слова, которые начинаются с "Foo" с пробелом

"Word1 Foo Word", "Some OtherWord FooWord", "Misc    FooXWord" (will find 3)

Предикат:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content BEGINSWITH[c] %@) OR (content CONTAINS[c] %@)", word, [NSString stringWithFormat:@" %@", word]];
8 голосов
/ 27 ноября 2014

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)", 
                              query,
                              [NSString stringWithFormat:@".*[^\\w]%@.*", query]];
7 голосов
/ 23 ноября 2015

У меня была такая же проблема, и сначала я думал, что ваши ответы могут помочь мне, но они не помогли. Этот помог мне, так что ... Посмотрите:

NSString *matchString =  [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"keyword MATCHES[c] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
0 голосов
/ 09 января 2018

Попробуйте использовать соединение:

NSCompoundPredicate *bPredicate =  [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]];
...