質問: [regularExpression matchesInString:str options:0 range:NSMakeRange(0, str.length)]; NSLog(@"マッチした数は%d",(int)[matchesInString count]); // ここが2になるはずです。 ```
回答: > > 正規表現が間違っているのか、Objective-Cのコードが間違っているか検討がつかない > > > ということですので、正規表現は正規表現として下記のサイトなどリアルタイムにマッチした結果を確認できるサービスなどを利用して、別に試行錯誤するのが良いと思います。 RegExr: Learn, Build, & Test RegEx: http://www.regexr.com で、実際の要件がいまいち見えませんが、おそらく望みの動作は次の正規表現で得られると思います。 ``` @"START(.*?)END" ``` `START`と`END`の間に任意の文字`.`の0回以上の繰り返し`*`、に最短一致数量子`?`を指定して、最も短い部分にマッチするようにしています(そうしないと、最初のSTARTと最後のENDの1つだけにマッチしてしまう)。 そして、間の文字を取り出せるようにカッコでグループ化しています。 この正規表現を利用してあなたのコードを実行すると、2件マッチして、「こんにちは」と「おはよう」をマッチした結果から取り出すことができます。 ``` NSString *str = @"STARTこんにちはENDさようならSTARTおはようENDまたねこんにちはばいばい"; NSError *error = nil; NSString *pattern = @"START(.*?)END"; NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; NSArray *matchesInString = [regularExpression matchesInString:str options:0 range:NSMakeRange(0, str.length)]; NSLog(@"マッチした数は%d", (int)[matchesInString count]); // ここが2になるはずです。 for (NSTextCheckingResult *result in matchesInString) { NSLog(@"%@", [str substringWithRange:[result rangeAtIndex:1]]); // 1回目: こんにちは // 2回目: おはよう } ```