今回は、RegExpクラスについて学ぶ。このクラスが扱うのは、文字列のパターンだ。そのパターンの表現は多彩で、奥が深い。本稿は、いわばその入り口を紹介する。
RegExpクラスで正規表現を使う
RegExpクラスは、「正規表現」(Regular Expression)と呼ばれ、文字列のパターンを扱う。RegExpインスタンスでパターンを記述すると、文字列を調べたり、Stringクラスのメソッドに引数として渡すことにより文字列を操作できる。
RegExpクラスのコンストラクタには、第1引数としてパターンの指定を文字列で渡す。そして、生成されたRegExpインスタンスつまり正規表現は、まずRegExpクラスのメソッドで用いられる。
RegExp.test()メソッドは、指定した文字列に正規表現のパターンに当てはまる文字列が含まれるかどうかを調べ、あればtrueなければfalseが返される。たとえば、文字列"Flashファイル(AS 3.0)"の中に、"AS"という文字列のパターンが存在するかどうかは、このパターンの文字列をRegExpコンストラクタに引数として渡し、RegExp.test()メソッドでつぎのように確かめればよい。[出力]パネルには、その存在を示すtrueが表示される。
RegExpインスタンスは、パターンを/(スラッシュ)で括って、リテラルで記述することもできる(「リテラル」については、第27回「XMLデータを扱う」の「XMLデータから必要な値を取出す」参照)。このときパターンの文字列にはクォーテーション(")をつけないので注意しよう(スクリプト1参照)。
つぎのスクリプト1は、文字列が納められた配列(languages_array)からforループでエレメントを順に取出し、"Script"という文字列のパターンが含まれるエレメントのみを別の新たな配列(result_array)に加えたうえで[出力]する(図1)。
Stringクラスで正規表現を使う
Stringクラスのメソッドには、正規表現を引数として指定できるものがある。たとえば、String.replace()は、検索・置換のメソッドだ。第1引数にRegExpインスタンスを渡すと、そのパターンに当てはまる文字列を第2引数の文字列と置換える。
以下のスクリプトは、改行として復帰文字"\r"が用いられた文字列に対して、String.replace()メソッドを呼出し、"\r"を"<br>に置換える。String.replace()メソッドの第1引数には、RegExpインスタンス/\r/をパターンとして渡した。
このスクリプトのように単純に文字列だけを指定したRegExpインスタンスは、パターンに当てはまる最初の文字列を示す正規表現になる[1]。したがって、String.replace()メソッドの置換結果も、最初の改行("\r")のみが文字列"<br>"に変わり、あとの改行はそのまま残ってしまった(図2)。
パターンと一致する文字列すべてを指定したいときには、正規表現に以下のようにg(global)フラグを添える。すると、今度はすべての改行("\r")が、正しく文字列"<br>"に変わる。[出力]はつぎのとおりだ(図3)。
複数のパターンのいずれかひとつを対象とする指定は、選択制御文字|を用いる。もちろん、パターンの数はいくつでも構わない。
たとえば、テキストファイルの改行コードは、プラットフォームによって異なる。Windowsは復帰文字+改行文字("\r\n")、Macintoshが復帰文字("\r")、UNIXやLinuxは改行文字("\n")だ。これらいずれのファイルの改行コードであっても同じパターンとして扱いたい場合には、つぎのような正規表現を指定すればよい。
改行コードを意識して解析しなければならない例としては、CSV(カンマ区切り)データの扱いが考えられる。CSVは、1件のデータ(レコード)を改行で区切り、その中の項目(フィールド)はカンマ(,)で分ける。そのCSVデータを、入れ子(2次元)の配列に変換してみよう。
文字列を指定した区切り文字でエレメントに分けて、配列に変換するには、String.split()メソッドを用いる。第1引数の区切り文字には、もちろん正規表現のパターンが指定できる。
改行コードのプラットフォームが特定できないCSVデータを、2次元配列に変換するフレームアクションが、スクリプト2だ。このような処理では、CSVデータは外部テキストファイルとされるのが普通だろう。しかし、外部ファイルの読込みはすでに解説した。また、あえて種類の異なる改行コードを混ぜるため、CSVデータをスクリプトで文字列として生成した。
3種類の改行コードのいずれかを示すパターンは、前述のとおりだ。それをString.split()メソッドの引数に渡し[2]、まず改行コードでエレメントに分けて配列にする(products_array)。
つぎに、その変換された配列エレメントすべてをforループで取出し、さらにカンマ(,)で区切った配列に変換して[3]、もとの文字列のエレメントと置換える。これで、入れ子の2次元配列ができ上がる。
なお、入れ子の配列は単純にtrace()関数で[出力]しても、すべてカンマ区切りで表示されるので、入れ子構造がわからない。そこで、確認のためforループで順にエレメントの子配列を取出し、そのエレメント数と子配列を[出力]した(図4)。
選択制御文字|以外にも「メタ文字」や「メタシーケンス」と呼ばれる特別な文字があり、さまざまな指定ができる。詳しくは、[ヘルプ]を参照してほしい。次回は、マウスイベントについて解説するつもりだ。
今回解説した次のサンプルファイルがダウンロードできます。