テキストの文字列で正しいWordを検索するためにNSPredicateをフォーマットする方法の解決策を探しています。現在、私はこのコードを使用しています:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(content CONTAINS[c] %@)", Word];
しかし、Wordが短い場合、間違った結果が返されます。たとえば、Wordが「ail」の場合、この3文字を含む単語を含むすべての文字列が返されます。文字列内の私の単語を「beginswith」?
BEGINSWITH
の代わりにCONTAINS
を使用するだけです。
編集
文字列のすべての単語を検索する必要がある場合は、WWDC 2010での講演の1つで紹介された手法があります。基本的な考え方は、単一の単語とそれを含むオブジェクトの参照を含む個別のエンティティWord
を作成することです。 (検索しているエンティティ)。次に、Word
エンティティを検索して、見つかった単語に関連するオブジェクトを返します。
クエリは次のようになります(エンティティとWord
の間に多対1の関係がある場合: "すべての単語BEGINSWITH [c]%@"
これは、オブジェクトを作成するときに単語を設定する必要があることを意味します。
最初にBEGINSWITH
で「Foo」を検索すると、文字列の先頭が見つかります
"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2)
"Foo"のCONTAINS
より(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]];
テキストの単語間に句読点が含まれている場合は、次の述語を使用できます。
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)",
query,
[NSString stringWithFormat:@".*[^\\w]%@.*", query]];
私は同じ問題を抱えていて、最初はあなたの答えが私を助けることができると思いましたが、彼らはそうしませんでした。これは私を助けたので...見てください:
NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"keyword MATCHES[c] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
化合物を使用してみてください:
NSCompoundPredicate *bPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]];