ちょっと前の記事でObjective-Cの正規表現を個人的にはじめて利用して、あまりに処理が冗長になるのでちょっと驚きました。
もうちょっと短くできないかと悩んでいたら、そこらへんをシンプルにしてくれそうなライブラリがあったので紹介します。
Objective-C-RegEx-Categoriesは名前の通り、NSRegularExpressionなどにカテゴリを追加するライブラリです (MITライセンス)。
どのくらい短くなるのかのサンプルとして、まずはNSRegularExpression
で書いたコードを次に示します。
1 2 3 4 5 6 | 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で書きかえたら次のようになります。
1 2 3 | 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には、利用例が数多くありますので、そちらを参照ください。
このライブラリのキモの部分はNSRegularExpression
をRx
とRX()
という2つのマクロにしたところかもしれません。
1 2 | #define Rx NSRegularExpression #define RX(pattern) [[NSRegularExpression alloc] initWithPattern:pattern] |
ただし、あまりに短いマクロなので、pchなんかに入れるとやばいことになるかもしれません。
あとは、NSString
とNSRegularExpression
へのカテゴリ追加です。indexOf:
やsplit:
などわかりやすくなっていたりするので、
ヘッダファイルにひと通り目を通しておくとよいかもしれません。
導入方法
RegExCategories.mとRegExCategories.hをプロジェクトに追加するだけです。
おわりに
ライブラリObjective-C RegEx Categoriesを紹介しました。
このライブラリではNSRegularExpression
のregularExpressionWithPattern:options:error:
にあるエラー処理ができなかったりするので、
状況によってはNSRegularExpression
由来のメソッドを利用したほうがよいときもあるかもしれません。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。