2013/12/18

Objective-Cでの正規表現処理が非常に簡潔になるライブラリObjective-C RegEx Categoriesを試す

ちょっと前の記事でObjective-Cの正規表現を個人的にはじめて利用して、あまりに処理が冗長になるのでちょっと驚きました。

もうちょっと短くできないかと悩んでいたら、そこらへんをシンプルにしてくれそうなライブラリがあったので紹介します。

Objective-C-RegEx-Categoriesは名前の通り、NSRegularExpressionなどにカテゴリを追加するライブラリです (MITライセンス)。

どのくらい短くなるのかのサンプルとして、まずはNSRegularExpressionで書いたコードを次に示します。

NSError* error = nil;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^#([0-9a-f]{6})$" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
if (matches.count != 1) return [UIColor blackColor];
NSTextCheckingResult* m = matches[0];
NSString* col = [string substringWithRange:[m rangeAtIndex:1]];

で、上のコードをObjective-C-RegEx-Categoriesで書きかえたら次のようになります。

RxMatch* mx = [RX(@"^#([0-9a-f]{6})$") firstMatchWithDetails:string];
if (mx.groups.count != 2) return [UIColor blackColor];
NSString* col = ((RxMatchGroup*) mx.groups[1]).value;

Readme.mdには、利用例が数多くありますので、そちらを参照ください。

このライブラリのキモの部分はNSRegularExpressionRxRX()という2つのマクロにしたところかもしれません。

#define Rx NSRegularExpression
#define RX(pattern) [[NSRegularExpression alloc] initWithPattern:pattern]

ただし、あまりに短いマクロなので、pchなんかに入れるとやばいことになるかもしれません。

あとは、NSStringNSRegularExpressionへのカテゴリ追加です。indexOf:split:などわかりやすくなっていたりするので、 ヘッダファイルにひと通り目を通しておくとよいかもしれません。

導入方法

RegExCategories.mとRegExCategories.hをプロジェクトに追加するだけです。

おわりに

ライブラリObjective-C RegEx Categoriesを紹介しました。

このライブラリではNSRegularExpressionregularExpressionWithPattern:options:error:にあるエラー処理ができなかったりするので、 状況によってはNSRegularExpression由来のメソッドを利用したほうがよいときもあるかもしれません。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。