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