正規表現

iphone正規表現を使う機会があったのでまとめ。

まず正規表現って何?って方はこちら

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: