正規表現 NSRegularExpression はさまれた文字を括弧で取得する "AB(.*)E"

iOS の正規表現の使い方メモです。
(iOS 5で試しています)
今回は 特定の文字列に挟まれたところを取得する方法を見ていきたいと思います。(capture groups)
iOS の正規表現では、次の二つのクラスがキーになります。
 NSRegularExpression : パターンを指定
 NSTextCheckingResult : ヒットしたRange の配列を保持
パターン指定の際に、抜き取りたいところを括弧() で括ると、それをキャプチャした結果が、NSTextCheckingResult の配列に追加されてきます。配列には、0 番目にパターンがマッチした文字列全体のRange、以降に括弧でキャプチャした文字列のRange と続いていきます。
では、試しに。
文字列 「かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ」という文字列のなかから、「ぴょこぴょこ」に挟まれた文字を抜き出すサンプル実装を書いてみます。

@implementation ViewController

- (void)viewDidLoad

{

    [superviewDidLoad];

    NSString *frogSong = @"かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ";

    NSRegularExpression *reg = [[NSRegularExpressionalloc] initWithPattern:@"(.*)ぴょこぴょこ(.*)ぴょこぴょこ(.*)ぴょこぴょこ(.*)ぴょこぴょこ" options:0 error:nil];

    NSArray *matches = [reg matchesInString:frogSong options:0 range:NSMakeRange(0, [frogSong length])];

    for (NSTextCheckingResult *result in matches) {

        NSLog(@"結果リスト数: %d", [result numberOfRanges]);

        for (int i = 0; i < [result numberOfRanges]; i++) {

            NSRange r = [result rangeAtIndex:i];

            // 0番目は全体、以降、パターンで指定した括弧に該当する文字列

            NSLog(@"検索結果 %@", [frogSong substringWithRange:r]);

        }

    }

}

これを実行するとこんな感じのログが出てきます。

結果リスト数: 5

NSTextCheckingResultの中身 かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ

NSTextCheckingResultの中身 かえる

NSTextCheckingResultの中身

NSTextCheckingResultの中身 あわせて

NSTextCheckingResultの中身