アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » ActionScript 3.0で始めるオブジェクト指向スクリプティング » 第28回 正規表現で文字列を扱う

ActionScript 3.0で始めるオブジェクト指向スクリプティング

第28回 正規表現で文字列を扱う

今回は,RegExpクラスについて学ぶ。このクラスが扱うのは,文字列のパターンだ。そのパターンの表現は多彩で,奥が深い。本稿は,いわばその入り口を紹介する。

RegExpクラスで正規表現を使う

RegExpクラスは,「正規表現」(Regular Expression)と呼ばれ,文字列のパターンを扱う。RegExpインスタンスでパターンを記述すると,文字列を調べたり,Stringクラスのメソッドに引数として渡すことにより文字列を操作できる。

RegExpクラスのコンストラクタには,第1引数としてパターンの指定を文字列で渡す。そして,生成されたRegExpインスタンスつまり正規表現は,まずRegExpクラスのメソッドで用いられる。

var 正規表現:RegExp = new RegExp(パターン)

RegExp.test()メソッドは,指定した文字列に正規表現のパターンに当てはまる文字列が含まれるかどうかを調べ,あればtrueなければfalseが返される。たとえば,文字列"Flashファイル(AS 3.0)"の中に,"AS"という文字列のパターンが存在するかどうかは,このパターンの文字列をRegExpコンストラクタに引数として渡し,RegExp.test()メソッドでつぎのように確かめればよい。[出力]パネルには,その存在を示すtrueが表示される。

var my_str:String = "Flashファイル(AS 3.0)";
var myPattern:RegExp = new RegExp("AS");
var bResult:Boolean = myPattern.test(my_str);
trace(bResult);   // 出力: true

RegExpインスタンスは,パターンを/(スラッシュ)で括って,リテラルで記述することもできる(「リテラル」については,第27回「XMLデータを扱う」の「XMLデータから必要な値を取出す」参照)。このときパターンの文字列にはクォーテーション(")をつけないので注意しよう(スクリプト1参照)。

var 正規表現:RegExp = /パターン/

つぎのスクリプト1は,文字列が納められた配列(languages_array)からforループでエレメントを順に取出し,"Script"という文字列のパターンが含まれるエレメントのみを別の新たな配列(result_array)に加えたうえで[出力]する(図1)。

スクリプト1 文字列の配列から正規表現のパターンに当てはまるエレメントを別の配列に取出す

// フレームアクション
var languages_array:Array = ["AS", "ActionScript", "JavaScript", "Java"];
var myPattern:RegExp = /Script/;
var result_array:Array = new Array();
var nLength:uint = languages_array.length;
for (var i:uint = 0; i < nLength; i++) {
  var language_str:String = languages_array[i];
  if (myPattern.test(language_str)) {
    result_array.push(language_str);
  }
}
trace(result_array);   // 出力: ActionScript,JavaScript

図1 正規表現のパターンに当てはまる文字列エレメントの配列が[出力]される

図1 正規表現のパターンに当てはまる文字列エレメントの配列が[出力]される

Stringクラスで正規表現を使う

Stringクラスのメソッドには,正規表現を引数として指定できるものがある。たとえば,String.replace()は,検索・置換のメソッドだ。第1引数にRegExpインスタンスを渡すと,そのパターンに当てはまる文字列を第2引数の文字列と置換える。

var 結果文字列:String = 対象文字列.replace(パターン, 置換文字列)

以下のスクリプトは,改行として復帰文字"\r"が用いられた文字列に対して,String.replace()メソッドを呼出し,"\r"を"<br>に置換える。String.replace()メソッドの第1引数には,RegExpインスタンス/\r/をパターンとして渡した。

var my_str:String = "Flash\rDreamweaver\rPhotoshop\rIllustrator";
var myPattern:RegExp = /\r/;
var result_str:String = my_str.replace(myPattern, "<br>");
trace(result_str);

このスクリプトのように単純に文字列だけを指定したRegExpインスタンスは,パターンに当てはまる最初の文字列を示す正規表現になる(※1)。したがって,String.replace()メソッドの置換結果も,最初の改行("\r")のみが文字列"<br>"に変わり,あとの改行はそのまま残ってしまった(図2)。

図2 パターンに複数当てはまっても置換えられるのは最初の文字列のみ

図2 パターンに複数当てはまっても置換えられるのは最初の文字列のみ

パターンと一致する文字列すべてを指定したいときには,正規表現に以下のようにg(global)フラグを添える。すると,今度はすべての改行("\r")が,正しく文字列"<br>"に変わる。[出力]はつぎのとおりだ(図3)。

Flash<br>Dreamweaver<br>Photoshop<br>Illustrator
var my_str:String = "Flash\rDreamweaver\rPhotoshop\rIllustrator";
var myPattern:RegExp = /\r/g;
var result_str:String = my_str.replace(myPattern, "<br>");
trace(result_str);

図3 パターンに当てはまる文字列すべてが置換えられる

図3 パターンに当てはまる文字列すべてが置換えられる

複数のパターンのいずれかひとつを対象とする指定は,選択制御文字|を用いる。もちろん,パターンの数はいくつでも構わない。

var 正規表現:RegExp = /パターンA|パターンB/

たとえば,テキストファイルの改行コードは,プラットフォームによって異なる。Windowsは復帰文字+改行文字("\r\n"),Macintoshが復帰文字("\r"),UNIXやLinuxは改行文字("\n")だ。これらいずれのファイルの改行コードであっても同じパターンとして扱いたい場合には,つぎのような正規表現を指定すればよい。

var myPattern:RegExp = /\r\n|\r|\n/

改行コードを意識して解析しなければならない例としては,CSV(カンマ区切り)データの扱いが考えられる。CSVは,1件のデータ(レコード)を改行で区切り,その中の項目(フィールド)はカンマ(,)で分ける。そのCSVデータを,入れ子(2次元)の配列に変換してみよう。

文字列を指定した区切り文字でエレメントに分けて,配列に変換するには,String.split()メソッドを用いる。第1引数の区切り文字には,もちろん正規表現のパターンが指定できる。

var 配列:Array = 文字列.split(区切り文字)

改行コードのプラットフォームが特定できないCSVデータを,2次元配列に変換するフレームアクションが,スクリプト2だ。このような処理では,CSVデータは外部テキストファイルとされるのが普通だろう。しかし,外部ファイルの読込みはすでに解説した。また,あえて種類の異なる改行コードを混ぜるため,CSVデータをスクリプトで文字列として生成した。

スクリプト2 正規表現によりCSVデータを2次元配列に変換

// フレームアクション
// CSVデータ生成
var products_str:String = "";
products_str += "Web,Flash CS4 Professional,699\r";
products_str += "Web,Dreamweaver CS4,399\r\n";
products_str += "Design,Photoshop CS4,699\n";
products_str += "Design,Illustrator CS4,599";
// CSVデータを2次元配列に変換
var myPattern:RegExp = /\r\n|\r|\n/;
var products_array:Array = products_str.split(myPattern);
var nLength:uint = products_array.length;
for (var i:uint = 0; i < nLength; i++) {
  var product_str:String = products_array[i];
  products_array[i] = product_str.split(",");
}
// 結果確認用
for (var j:uint = 0; j < nLength; j++) {
  var product_array:Array = products_array[j];
  trace(product_array.length, product_array);
}

3種類の改行コードのいずれかを示すパターンは,前述のとおりだ。それをString.split()メソッドの引数に渡し(※2),まず改行コードでエレメントに分けて配列にする(products_array)。

つぎに,その変換された配列エレメントすべてをforループで取出し,さらにカンマ(,)で区切った配列に変換して(※3),もとの文字列のエレメントと置換える。これで,入れ子の2次元配列ができ上がる。

なお,入れ子の配列は単純にtrace()関数で[出力]しても,すべてカンマ区切りで表示されるので,入れ子構造がわからない。そこで,確認のためforループで順にエレメントの子配列を取出し,そのエレメント数と子配列を[出力]した(図4)。

図4 取出したXMLインスタンスのtrace()関数による[出力]

図4 取出したXMLインスタンスのtrace()関数による[出力]

選択制御文字|以外にも「メタ文字」や「メタシーケンス」と呼ばれる特別な文字があり,さまざまな指定ができる。詳しくは,[ヘルプ]を参照してほしい。次回は,マウスイベントについて解説するつもりだ。

※1
最初に検索された文字列だけを置換えたいときは,String.replace()メソッドの第1引数に(正規表現でなくとも)その検索する文字列を直接指定すれば足りる。
※2
String.split()メソッドの第1引数で指定する区切り文字は,参照した文字列の中のすべてがエレメントを切り分ける文字として処理される。したがって,String.replace()メソッドの引数の場合とは異なり,正規表現にg(global)フラグは添えない。
※3
区切り文字に単純な文字列を用いる場合には,正規表現でなく,文字列のまま指定できる。

今回解説した次のサンプルファイルがダウンロードできます。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

  • ActionScript 3.0プロフェッショナルガイド

    ActionScript 3.0プロフェッショナルガイド(毎日コミュニケーションズ)

  • ActionScript 3.0辞典 [FlashPlayer 10/9対応]

    ActionScript 3.0辞典 [FlashPlayer 10/9対応](翔泳社)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス