Cocoa プログラミング

Foundation

iOS/OS X で正規表現を利用するには NSRegularExpression を利用するのが一般的ですが、簡単な置換であれば NSString クラスだけでも実現できます。

グループ化による後方参照も利用できます。

NSRegularExpression を使わずに正規表現で置換する

iOS/OS X で正規表現を利用するにはNSRegularExpression を利用するのが一般的ですが、簡単な置換であればNSString クラスのNSString メソッドだけでも実現できます。

グループ化による後方参照も利用できます。

NSRegularExpressionSearch を指定して文字列を置換する

NSString だけで正規表現による置換を行うためには、stringByReplacingOccurrencesOfString:withString:options:range: メソッドを使用します。

このoptions のところにNSRegularExpressionSearch オプションを指定することで、最初の引数のところに正規表現パターンを指定して文字列の置換を行えます。

NSString* text = @"NSInteger value = 10;";
	
NSString* pattern = @"(\\w+)\\s(\\w+)\\s=\\s(\\d+);";
NSString* replace = @"let $2:$1 = $3";
	
NSString* result = [text stringByReplacingOccurrencesOfString:pattern withString:replace options:NSRegularExpressionSearch range:NSMakeRange(0, text.length)];
	
NSLog(@"%@", result);

このようなコードを実行すると、変数pattern に設定した正規表現で合致した部分が、変数replace で指定した文字列で置き換えられて、上記の例では次の文字列が、変数result に設定されます。

let value:NSInteger = 10

指定する引数について

#1: 検索する文字列

最初の引数では「正規表現パターン」を文字列で指定することになります。

ここで注意したいところは、正規表現で特殊な意味を持つバックスラッシュの記号を文字列の中に含める必要があるところでしょうか。バックスラッシュがひとつだけだと、文字列としてのエスケープ記号になってしまうので、ふたつ重ねてバックスラッシュそのものになるようにしています。

#2: 置換する文字列

第 2 引数では、パターンにマッチした部分を置き換える文字列を指定します。

正規表現パターンで指定した範囲の内容が、ここで指定した文字列に置き換わるのですが、このとき$1$2 などといった、正規表現による置換で特有の特殊変数が利用できます。それによって、正規表現パターン内で括弧を使ってグループ指定した内容が、最初のものから順番に$1 のようにして取り出せます。

本来であれば他にも $'$& などといった特殊変数も一般的ですが、今回の方法ではそれらは利用できないようです。

#3: 検索オプション

第 3 引数でNSRegularExpressionSearch を指定することで、検索する文字列が正規表現パターンで指定されたものとして扱われます。置換する文字列でも、グループ指定した部分に合致したものに置き換えるための特殊変数が利用できます。

置換する文字列として $ そのものを指定したいときは \\$ という文字列を指定すれば良いようです。

#4: 置換する範囲

最後の引数ではNSRange 型を使って、検索対象にする文字列の範囲を指定できます。

今回の例では、変数text の内容の最初から最後までを検索対象にするために、範囲をNSMakeRange(0, text.length) にしています。