9776


"STARTこんにちはENDさようならSTARTおはようENDまたねこんにちはばいばい"

上の文字列から、「こんにちは」と「おはよう」を抜き出したいと思っております。  
以下のようなコードをかきましたが、マッチ数が2個になりません。  
正規表現が間違っているのか、Objective-Cのコードが間違っているか検討がつかない状況です。  
詳しい方、ご助言をいただけないでしょうか？

[code]

    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になるはずです。
    
[/code]


CC BY-SA 3.0
2015-05-02T12:13:17.747
9772
2015-05-02T13:50:08.203
7699
question
ios objective-c 正規表現
正規表現がうまくいきません


> 正規表現が間違っているのか、Objective-Cのコードが間違っているか検討がつかない

ということですので、正規表現は正規表現として下記のサイトなどリアルタイムにマッチした結果を確認できるサービスなどを利用して、別に試行錯誤するのが良いと思います。

[RegExr: Learn, Build, & Test RegEx:
http://www.regexr.com](http://www.regexr.com)

で、実際の要件がいまいち見えませんが、おそらく望みの動作は次の正規表現で得られると思います。

[code]

    @"START(.*?)END"
    
[/code]

`START`と`END`の間に任意の文字`.`の0回以上の繰り返し`*`、に最短一致数量子`?`を指定して、最も短い部分にマッチするようにしています（そうしないと、最初のSTARTと最後のENDの１つだけにマッチしてしまう）。  
そして、間の文字を取り出せるようにカッコでグループ化しています。

この正規表現を利用してあなたのコードを実行すると、2件マッチして、「こんにちは」と「おはよう」をマッチした結果から取り出すことができます。

[code]

    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回目: おはよう
    }
    
[/code]


CC BY-SA 3.0
2015-05-02T13:50:08.203
9776
2015-05-02T13:50:08.203
5519
9772
answer