8

これは重複している必要があります。しかし、NSPredicateの質問が非常に多いため、適切な質問を見つけることができません。

フィールドを含むコアデータオブジェクトのリストがありcompositeNameます。「エミリーブラント」のような名前がそこにある可能性があります。NSPredicate「Em」だけでなく「Bl」も検索できるを使用してリストを検索し、フェッチされた結果にこの名前が表示されるようにします。

これは非常に簡単なはずですが、ご想像のとおり、私にはわかりません。正規表現を使用したNSPredicateでの機能不全の試みは、次のようになります。

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query];

この正規表現に対する私の考えは次のとおりです。

  • 前の任意の数の文字
  • ネガティブルックビハインドスペースまたは始まり
  • クエリ
  • 後の任意の数の文字

しかし、それは機能していません。結果が得られません。これを修正するにはどうすればよいですか?

PS私の目的にも合う正規表現のないNSPredicateソリューションがある場合。

4

1 に答える 1

16

述語文字列の外側に正規表現パターン文字列全体を構築し、それを述語に渡す必要があります。

\bまた、単語境界に一致する正規表現構造があります。これは、あなたが求めているものです。

したがって、このスニペットは問題に対する簡単な解決策を提供するはずです。

NSString *searchString = @"Em";
NSString *regexString  = [NSString stringWithFormat:@".*\\b%@.*", searchString];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];

入力検索テキストが消去されていない場合は、正規表現エンジンに渡す前に消去することをお勧めします。

もう 1 つの改善点は、単語の境界で Unicode 文字を受け入れて、人々が「Ántonio」、「Über」、およびその他の類似の文字列を検索できるようにすることです。

次のコード行は、両方の側面を処理する正規表現パターンを作成します。

NSString *orgSearchString = @"^";

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];

NSString *regexString  = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];
于 2012-06-17T15:29:47.370 に答える