![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||||||||||
![]() |
Optimizing Performance of ActionScript 3.0 Chapter 07 マニアックなテクニック □07-02 文字列の検索・置換は正規表現よりStringクラスの方が速い正規表現(RegExpクラス)を使うと文字列のパターンが定められます。正規表現とStringクラスのメソッドを組合わせると、複雑な文字列の操作ができます。けれど、簡単な検索・置換であれば、Stringクラスのプロパティやメソッドだけを使った方が文字列の扱いは速いです。 お題はつぎの文です。この文の中の「もも」を「みみ」に置換えましょう。ただし、助詞の「も」はそのまま残します。 すももも、ももも、もも、もももいろいろ つまり、置換えた結果はつぎの文になります。 すみみも、みみも、みみ、みみもいろいろ ○07-02-01 正規表現で文字列を置換える var myPattern:RegExp = /パターン/ 文字列の検索・置換はString.replace()メソッドで行います。メソッドの第1引数にはRegExpインスタンスで定めた検索する文字列のパターン、第2引数には置換える文字列が渡せます。 文字列.replace(検索パターン, 置換文字列) 正規表現とString.replace()メソッドを使ってお題の検索・置換したのがつぎのスクリプトです。
RegExpインスタンスの使い方についてふたつ補足します。第1は、スラッシュ//で括った中に書く文字列(もも)は、ダブルクォーテーション("")で囲みません。第2は、スラッシュ//の後に添えたフラグgの意味です。このフラグがないと、検索対象として参照するお題の文の中で、パターンに当てはまる最初の文字列だけの指定になります。文中のパターンに当てはまるすべての文字列を対象とするには、globalフラグgを加えなければならないのです。
○07-02-02 String.split()とArray.join()メソッドで文字列を置換える var result_array:Array = 文字列.split(区切り文字) つぎに、Array.join()メソッドは、String.split()メソッドとは逆に、配列エレメントをつなげて文字列にして返します。そのとき、引数として渡した文字列をエレメントの間に挿入します。 var result_str:String = 配列.join(挿入文字) これらふたつのメソッドを使ってお題の文中の文字列を置換えたのがつぎのスクリプトです。String.split()メソッドで検索文字列が一旦文から除かれ、そこにString.split()メソッドが置換文字列を挿入しています。
このString.split()とArray.join()メソッドを使った置換えの方が、正規表現を使うより速いようです。 ○07-02-03 Stringクラスのプロパティとメソッドで文字列を置換える まず、参照する文字列の中の検索文字の位置を調べるのが、String.indexOf()メソッドです。返される文字の位置は0から始まるインデックスで、参照する文字列の中で検索文字が最初に見つかったインデックスを示します。オプションの第2引数には、検索を始めるインデックスが渡せます。よって、検索文字が最初に見つかったインデックスに検索文字数を加えて第2引数に渡せば、つぎの検索文字のインデックスが得られます。 var index:int = 文字列.indexOf(検索文字, 検索開始位置) forループで検索文字を順に探していけば、すべての検索文字のインデックスが調べられます。検索文字が見つからないときは-1が返されますので、この戻り値をもってforループの終了とします(継続条件としては、「-1 < 戻り値」となります)。 つぎに、文字列から一部を切り出すのが、String.substring()メソッドです。ふたつの引数には、それぞれ開始位置と終了位置のインデックスを定めます。戻り値は取出された文字列です。 var result_str:String = 文字列.substring(開始位置, 終了位置)
あとは、文字列の長さ(文字数)をString.lengthプロパティで調べ、連結演算子+で文字列をつなげることがおわかりになれば、スクリプトを書く準備は整いました。文字列の検索・置換を、つぎのスクリプト07-02-001のように関数(xReplace())として定義します。 スクリプト07-02-001【○】Stringクラスのプロパティとメソッドで文字列の置換えをする関数の定義
関数(xReplace())の中で肝になるのは、forループで文字列をつぎはぎする操作です(スクリプト07-02-001第8〜10行目)。検索開始位置(i)から検索文字(find_str)の見つかった位置(end)まで取出した文字列に、置換文字(replace_str)を足して置換後の文字列(result_str)としてつなげるという操作(第9行目)が繰返されています。forループの継続条件でもう検索文字が見つからなくなり、String.indexOf()メソッドが-1を返すまで処理は続けられます。
前述07-02-01および07-02-02と比べると、スクリプトは明らかに長くなりました。けれど、正規表現のように複雑なパターンを扱うことはなく、StringとArrayといったふたつのクラスのインスタンスをつくったりもしません。ただ、文字列をひと文字ずつ調べて、取出し、つなげるだけの単純な操作の繰返しです。それが処理の速さにつながっているのでしょう。
作成者: 野中文雄 Copyright © 2001-2011 Fumio Nonaka. All rights reserved. |
||||||||||