[AS3] 文字列の検索・置換は正規表現よりStringクラスのメソッドを使う方が速い [Edit]

文字列の検索・置換は、String.replace()メソッドに正規表現(RegExpクラス)を使うと簡単です(スクリプト001)。なお、正規表現による文字列の検索・置換については、「正規表現で文字列を扱う」をお読みください。

スクリプト001■String.replace()メソッドと正規表現で文字列を検索・置換
var test_str:String = "すもももももももももももいろいろ";
var result_str:String = test_str.replace(/もも/g, "みみ");
trace(result_str);  // 出力: すみみみみみみみみみみもいろいろ

もっとも、処理の速さは、Stringクラスのメソッドを組合わせて書いたスクリプトの方が勝るようです。

具体的には、メソッドString.indexOf()で検索文字列を探し、String.substring()またはString.substr()により置換文字列と連結します。流れとしては、つぎの3つの処理を検索文字列がなくなるまで繰返します。これを関数(xReplace())として定義したのが以下のスクリプト002です。

  1. 最初の検索文字列の位置を求める
  2. その位置までの文字列を結果に加え、置換文字列を連結する
  3. 検索開始位置を残った文字列の先頭に移す
var test_str:String = "すもももももももももももいろいろ";
trace(xReplace(test_str, "もも", "みみ"));
スクリプト002■メソッドString.indexOf()とString.substring()で文字列を検索・置換
function xReplace(source_str:String, find_str:String, replace_str:String):String {
	var numChar:uint = find_str.length;
	var end:int;
	var result_str:String = "";
	for (var i:uint = 0; -1 < (end = source_str.indexOf(find_str, i)); i = end + numChar) {
		result_str +=  source_str.substring(i, end) + replace_str;
	}
	result_str +=  source_str.substring(i);
	return result_str;
}

スクリプト001と002の速さの違いをwonderflのテスト用スクリプトで比べてみました。スクリプト002の方が行数も繰返しも多いのに、正規表現を使うよりかなり速いようです。

Replacing string by using RegExp or String class only - wonderfl build flash online

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事