ホーム > iOS > NSPredicateでの正規表現について。その4

NSPredicateでの正規表現について。その4 このエントリーを含むはてなブックマーク はてなブックマーク - NSPredicateでの正規表現について。その4

2015 年 8 月 15 日

NSPredicateでの正規表現について。その3 » サイキョウライン

ということは、この結果はどういうことなの?どう説明するの?

その2、3の方でコメントをいただいたので、コードを指定して試してみました。(うりかねぐんさんありがとうございます!)
結果は下記の様な感じです。

NSPredicate *p1 = [NSPredicate predicateWithFormat:@"self matches '\\\\u0030'"];
NSLog(@"%@", p1);                            //=> SELF MATCHES "\\u0030"
NSLog(@"%d", [p1 evaluateWithObject:@"0"]);  //=> 1
NSLog(@"%d", [p1 evaluateWithObject:@"0"]); //=> 1
NSLog(@"%d", [p1 evaluateWithObject:@"9"]);  //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"9"]); //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"A"]);  //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"A"]); //=> 0

NSPredicate *p2 = [NSPredicate predicateWithFormat:@"self matches '\\\\u0039'"];
NSLog(@"%@", p2);                            //=> SELF MATCHES "\\u0039"
NSLog(@"%d", [p2 evaluateWithObject:@"0"]);  //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"0"]); //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"9"]);  //=> 1
NSLog(@"%d", [p2 evaluateWithObject:@"9"]); //=> 1
NSLog(@"%d", [p2 evaluateWithObject:@"A"]);  //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"A"]); //=> 0

「\u0030」が「0」にも「0」にもマッチしていたり、「\u0039」が「9」にも「9」にもマッチしています。
参考として0と0、9と9のコードはこちらです。

NSLog(@"\\u%04x", [@"0" characterAtIndex:0]);  //=> \u0030
NSLog(@"\\u%04x", [@"0" characterAtIndex:0]); //=> \uff10
NSLog(@"\\u%04x", [@"9" characterAtIndex:0]);  //=> \u0039
NSLog(@"\\u%04x", [@"9" characterAtIndex:0]); //=> \uff19

サンプルなのでselfとしていたのですが、実際は下記の様に使おうとしていまして、NSPredicateを使わない選択肢がない状態です。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code matches '.*[^\\\\u0030-\\\\u0039]+?.*"];
NSArray *hoges = [Hoge MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate];

要はcodeに半角数字以外が混じっているデータを取り出したいだけなんですが、iOS(CoreData?)的にはどうするのが相応しいのでしょうか。


カテゴリー: iOS タグ:
  1. 2015 年 8 月 17 日 11:55 | #1

    全然ちゃんと見てないですが、もしかするとこれで対応できるかもです。どうも NSStrings にしないといけないっぽい?

    http://stackoverflow.com/questions/7540329/nspredicate-compare-with-integer

  2. 2015 年 8 月 17 日 14:47 | #2

    たびたびありがとうございます、QAを確認してみました。
    数値を検索条件にするなら文字列型のままではなく、数値型に変換してから渡せ、というやりとりでした。
    今回の要件は「どんな文字が入るか分からない」項目に対して「半角数字のみで構成された情報」のみを抽出したいということでした。
    なので、明確に半角数字が判断出来る方法が見つからないと要件を満たせなそうです。
    抽出時に全角半角を考慮するのではなくて、入力時に「全角数字はすべて半角へ変換する」ようにして、そもそも全角数字が入る可能性自体を潰す方法で行こうと考えています。

  3. 2015 年 8 月 17 日 17:43 | #3

    全角を半角に事前変換しておく方がよさそうですね。
    中途半端な情報ですみませんでした。

  4. 2015 年 8 月 17 日 22:01 | #4

    いえいえ、ここまでお付き合いいただきありがとうございました。

コメントは受け付けていません。