正規表現
objcで正規表現を使って特定の文字列を取得するには二つのアプローチがある模様。
- NSStringに対してrangeOfStringを使う。
- NSRegularExpressionにNSStringのオブジェクトを渡す。
NSStringに対してrangeOfStringを使う。
rangeOFStringの引数optionsにNSRegularExpressionSearchを渡してやると正規表現を使ってNSRangeを得る事ができるようになります。rangeOfStringを使って正規表現にマッチする範囲をmatchに渡し、後で使うときはmatchの範囲の文をsubstringWithRangeで得ています。
NSString *string = @"東京は寒い。カナダはもっと寒い。"; NSRange match = [string rangeOfString:@"カナダはもっと.+" options:NSRegularExpressionSearch]; if (match.location != NSNotFound) { NSLog(@"Found: %@",[string substringWithRange:match]); } else { NSLog(@"Not Found"); }
NSRegularExpressionにNSStringのオブジェクトを渡す。
NSRegularExpressionにNSStringのオブジェクトを渡し、正規表現にマッチした箇所をmatchに渡しています。
どうやら0番目に正規表現に該当する箇所全体。1番目以降に正規表現において()でくくられた箇所に該当するものがmatchに入るようです。
NSString *string = @"@Peeei iphoneアプリの開発ワクワク from @penpen"; NSError *error = nil; NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"@([0-9a-zA-Z]{1,15}).+" options:0 error:&error]; if (error != nil) { NSLog(@"%@", error); } else { NSTextCheckingResult *match = [regexp firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; NSLog(@"%d", match.numberOfRanges); NSLog(@"%@", [string substringWithRange:[match rangeAtIndex:0]]); NSLog(@"%@", [string substringWithRange:[match rangeAtIndex:1]]); }
場合に応じてメソッドを帰る必要がありそうです。
最初にマッチングする箇所がほしい場合 => firstMatchInString options: range:
マッチングする箇所すべてがほしい場合 => matchesInString options: range:
マッチングしたら逐次処理を行いたい場合 => enumerateMatchesInString:options:range:usingBlock: