アーカイブ

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

2015 年 8 月 15 日 コメント 4 件

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 タグ: