2016-05-23 4 views
2

ココアでは、正規表現はおそらく文字一致のICU Unicodeルールに従います.ICU標準には、すべての種類のUnicode文字を一致させるための文字プロパティ(\p{L}など)が含まれています。しかし文字列にUnicode文字が含まれているかどうかを確認する方法はありますか?

NSString* str = @"A"; 
NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES '\\p{L}'"]; 
NSLog(@"%d", [pred evaluateWithObject:str]); 

は、コンパイルしていないようです:文字プロパティがサポートされていない場合は

Can't do regex matching, reason: Can't open pattern U_REGEX_BAD_INTERVAL (string A, pattern p{L}, case 0, canon 0) 

(彼らは何ですか?)、文字列は私のiOSアプリでのUnicode文字が含まれている場合、私はチェックすることができどのように他?ここ

+0

あなたが倍増する必要がありますバックスラッシュ - '\\ p {L}'ですが、 'MATCHES'は完全な文字列の一致が必要です。 '。* \\ p {L}。*'または '(?s)。* \\ p {L}。*' –

+0

@WiktorStribiżewを見てください。 –

+0

さて、これは次のように動作すると思います: 'NSString * rx = @"(?s)。* \\ p {L}。* "; \t NSPredicate * predicat = [NSPredicate predicateWithFormat:@ "SELF MATCHES%@"、rx]; '。また、 'NSPredicate * predicat = [NSPredicate predicateWithFormat:@" SELF MATCHES '(?s)。* \\ p {L}。*' "];' - [それは動作します](https://ideone.com)/MBmFea) –

答えて

2

主なポイントはMATCHESは、完全な文字列の一致を必要とし、また、正規表現エンジンに渡された\バックスラッシュがリテラルバックスラッシュでなければならないことです。試合0以上の任意の文字

  • \p{L}
  • - - DOTALLモード
  • .*を有効にする - Unicodeの文字と一致し

    • (?s)

      正規表現は、このように意味

      (?s).*\p{L}.* 
      

      をすることができ

    • .* - ゼロ個以上の文字に一致します。 iOS版で

    、ちょうど二重のバックスラッシュ:

    NSPredicate * predicat = [NSPredicate predicateWithFormat:@"SELF MATCHES '(?s).*\\p{L}.*'"]; 
    

    NSPrediciate内のバックスラッシュは、特に使用を治療している場合IDEONE demo

    を参照してください:

    NSPredicate * predicat = [NSPredicate predicateWithFormat:@"SELF MATCHES '(?s).*\\\\p{L}.*'"]; 
    
  • 関連する問題