Как найти beginwith слово в строке с использованием NSPredicate?
Я ищу решение о том, как отформатировать NSPredicate для поиска правильного слова в строке текста.
В настоящее время я использую этот код:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(content CONTAINS[c] %@)", word];
но он возвращает неверные значения, если слово короткое, например:
если слово "ail", оно вернет все строки со словами, которые включают эти 3 буквы. Но мне не нужен такой абстрактный поиск, так как искать слова "начинается с" моего слова в строке "
Ответы
Ответ 1
Просто используйте BEGINSWITH
вместо CONTAINS
.
Edit
Если вам нужно искать в каждом слове строки, есть методика, которая была представлена в одном из разговоров в WWDC 2010. Основная идея заключается в создании отдельного объекта Word
, который содержит одно слово и ссылку на содержащий объект (объект, который вы ищете). Затем вы выполняете поиск в объекте Word
и возвращаете объекты, связанные с найденными словами.
Затем запрос будет выглядеть примерно так (при условии, что у вас есть отношение "один к одному" между вашим объектом и Word
: "ЛЮБЫЕ слова BEGINSWITH [c]% @"
Это означало бы, что вам нужно настроить слова при создании своих объектов.
Ответ 2
найдите сначала 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]];
Ответ 3
У меня была такая же проблема, и сначала я подумал, что ваши ответы могут мне помочь, но они этого не сделали. Это помогло мне, так что... Посмотрите:
NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"keyword MATCHES[c] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
Ответ 4
Если ваш текст содержит некоторые символы пунктуации между словами, вы можете использовать этот предикат:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)",
query,
[NSString stringWithFormat:@".*[^\\w]%@.*", query]];