2012-06-17 16 views
8

これは重複している必要があります。しかし、そこに多くのNSPredicateの質問があると、私は正しいものを見つけることができません。単語の先頭に一致する文字列を持つNSPredicate

私はcompositeNameフィールドを含むCore Dataオブジェクトのリストを持っています。 「Emily Blunt」のような名前がそこにある可能性があります。私はNSPredicateを使ってリストを検索して、 "Em"を検索するだけでなく "Bl"を検索して、この名前を取り出した結果に表示させたいと思います。

これは非常に簡単である必要がありますが、あなたが推測するように、私はそれを見ていません。正規表現とNSPredicateでの私の機能不全の試みは、次のようになります。この正規表現のための

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

私の考えがあった。

  • 否定後読みスペースの前に

    • 任意の数の文字や
    • を開始します
    • クエリ
    • の後の任意の文字数

    しかし、動作していません。私は何の結果も得ていない。これをどうやって解決するのですか?

    P.S.私の目的にも合致する正規表現がないNSPredicateソリューションがある場合。

  • +0

    [「全単語」NSPredicateてNSStringので検索](HTTPのが重複する可能性:// stackoverflowのコードの

    次の行では、両方の側面の世話をする正規表現パターンを作成します。 com/questions/8559156/nsstring-through-nspredicateの全単語検索) – epologee

    答えて

    16

    述語文字列の外に完全な正規表現パターン文字列を作成し、それを述語に渡す必要があります。

    また、単語の境界に一致する正規表現の構造体\bがあります。完全に、これはあなたの問題の簡単な解決策与えるべき

    ので:入力された検索テキストが清掃されていない場合

    NSString *searchString = @"Em"; 
    NSString *regexString = [NSString stringWithFormat:@".*\\b%@.*", searchString]; 
    
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString]; 
    

    を使用すると、正規表現エンジンにそれを渡す前に、あなたはそれをしたいかもしれません。

    単語境界でユニコード文字を受け入れることで、人々が 'Ántonio'、 'Über'などの文字列を検索できるようにすることもできます。

    NSString *orgSearchString = @"^"; 
    
    NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 
    
    NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString]; 
    
    関連する問題