web-dev-qa-db-ja.com

NSPredicateを使用して文字列内のBeginwithWordを見つける方法は?

テキストの文字列で正しいWordを検索するためにNSPredicateをフォーマットする方法の解決策を探しています。現在、私はこのコードを使用しています:

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

しかし、Wordが短い場合、間違った結果が返されます。たとえば、Wordが「ail」の場合、この3文字を含む単語を含むすべての文字列が返されます。文字列内の私の単語を「beginswith」?

36
azia

BEGINSWITHの代わりにCONTAINSを使用するだけです。

編集

文字列のすべての単語を検索する必要がある場合は、WWDC 2010での講演の1つで紹介された手法があります。基本的な考え方は、単一の単語とそれを含むオブジェクトの参照を含む個別のエンティティWordを作成することです。 (検索しているエンティティ)。次に、Wordエンティティを検索して、見つかった単語に関連するオブジェクトを返します。

クエリは次のようになります(エンティティとWordの間に多対1の関係がある場合: "すべての単語BEGINSWITH [c]%@"

これは、オブジェクトを作成するときに単語を設定する必要があることを意味します。

64
Alfonso

最初に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]];
23
Peter Lapisu

テキストの単語間に句読点が含まれている場合は、次の述語を使用できます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)", 
                              query,
                              [NSString stringWithFormat:@".*[^\\w]%@.*", query]];
8
Mansurov Ruslan

私は同じ問題を抱えていて、最初はあなたの答えが私を助けることができると思いましたが、彼らはそうしませんでした。これは私を助けたので...見てください:

NSString *matchString =  [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"keyword MATCHES[c] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
7
Bruno Muniz

化合物を使用してみてください:

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