天満橋な火曜
なんか時間が速い。
復刻第16弾!
2004年4月1日号
━━━━━━━━━━━━━━━━━━━━━ 2004.04.01 Vol.937 ━━━━━ ■□■□■ ■□■□■ 日刊「WEBのツボ!」 □■□■□ http://www.soho-union.com/ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 配信部数 3264部 「続 システムはオブジェクト指向 Ruby & Flash」(#006) 福井修@Fsys.NET 【○】本日のお題 「 入力チェックと正規表現 」 ━━━━━━━━━━━ こんにちは、Fsys福井システムリサーチの福井です。今日は良い日ですね^^;;;; リッチクライアントとしてのFlashは、サーバサイドフレームワーク「Flex」で 進化するようです。注1) せっかくColdFusinしている方々の梯子ははずされてしまうのですね。まあマイ クロソフトは、.NETを掲げてVBやASPの梯子をはずしてしまうし、JavaもJSFの登 場で現状環境の変革は余儀なくされるわけです。ソフト開発環境の賞味期限は切 れて行くわけで、開発環境に何を選ぶかは、まあどの株を買うかというようなも のかもしれません。 勝ち馬に乗らないといけないし、将来性もきちんと見据えなければなりません。 20年前と変わっていないことは、たぶん20年後も変わっていないでしょう。 10年前と変わっていないことは、たぶん10年後も変わっていないでしょう。 Rubyは、1993年にオブジェクト指向言語として生まれて、着々と成長してい ます。今年は次期Ruby=Ruby2の話が本格化するようです。注2) 前回「続Ruby でファイル操作入門」注3)にて標準入出力、リダイレクト、文字 コード変換、ファイルの書き込みを話題にしました。『レシーバ』の理解が、オ ブジェクト指向言語の使用でポイントになります。これをやさしい Ruby で理解 すると敷居の高い(ところもある)ActionScriptで敷居を乗り越えやすくなりま す。ActionScriptを難しいと感じている方は、Rubyでオブジェクト指向のスキル を磨くのが有利かも。 今回は、コード変換を復習してから、久しぶりに ActionScriptのコードも交え 入力チェックを話題にして正規表現に話しをすすめます。 Webでも、正規表現が使えると楽しい世界が広がります。 ノートPCにWindowsXPという環境で、どんどん楽しいプログラムを進めましょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ コード変換 復習 ──────────────────────────────────── はじめに、前回、コード変換フィルタの話しをしました。ちょっと復習しておき ます。 LinuxやUnixでの EUC のファイルを Windowsの Shift_JIS に変換するのに euc2sjis.rb を挙げました ---- ここから euc2sjis.rb ------ ## euc2sjis.rb # EUCからShift_JISへコード変換 require 'nkf' while line = ARGF.gets print NKF.nkf('-Es',line).chomp,"\r\n" end ---- ここまで euc2sjis.rb ------ nkf(漢字変換フィルタ)の引数によって、いろいろな変換ができます。 Shift_JISからEUCに変換するにはsjis2euc.rbのようになります。 ---- ここから sjis2euc.rb ------ ## sjis2euc.rb # Shift_JISからEUCへコード変換 require 'nkf' while line = ARGF.gets print NKF.nkf('-Se',line).chomp,"\r" end ---- ここまで sjis2euc.rb ------ 主な nkfの引数は、次のとおり -j JISコードを出力する。(デフォルト) -e EUCコードを出力する。 -s シフトJISコードを出力する。 -E 入力コードに日本語EUCを仮定する。 -S 入力コードにMS漢字を仮定する。X0201仮名も仮定される。 -X 入力コードにMS漢字中にX0201仮名があると仮定する。 詳細は、Linuxをお使いなら $ man nkf で見ることもできます。 nkf は、コマンドとしても動作します。(こちらが元の使い方^^) さて ここで ユニコードの変換についても少し言及します。 nkfは、nkf2.0でユニコード対応になっています。また ユニコード変換には、 Unicode 変換用拡張モジュール uconv.rb というモジュールもありまして、私は UTF-8変換には、使わせてもらっています。 ---- ここから sjis2utf8.rb ------ ## sjis2utf8.rb # Shift_JISからUTF-8へコード変換 require 'uconv' while line = ARGF.gets print Uconv.sjistou8(line) end ---- ここまで sjis2utf8.rb ------ XMLのハンドリングでは、ユニコードを避けて通れないのですが、まあ変換一発 です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 入力チェック ──────────────────────────────────── 前に2003.10.30 Vol.856 「システムはオブジェクト指向 Ruby & Flash」(#007) 【 実践編 】LoadVars連携での ログイン認証 注5) にて ActionScriptでの入力チェックを紹介しました。 入力フィールドのTextFieldに紐付けられたインスタンスに対して「restrict」 プロパティで、入力文字の制約を記述することができます。 【入力制約例】 // 入力チェック制約定義 _root.uid.restrict = "0-9" // 半角数字 ここで入力可能な文字を指定します。 _root.uid.restrict = "yn" // y:yes or n:no "yn"とすれば "y"か"n"しか入力できなくなります。 英小文字と大文字に限定するには _root.uid.restrict = "a-zA-Z" // 英小文字、大文字のみ ActionScriptでは、正規表現は、サポートされていないので、制約の記述も限 定されます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 正規表現入門 ─────────────────────────────────── 正規表現というのは、Regular Expression の訳でいまひとつピンとこない^^ のですが「文字列のパターンを表す方法」=文字列集合を表現する方式です。 この連載でも既に何度も 正規表現は登場しているのですが、「オブジェクト 指向」なんかと同様、なじんでいないフィールドとして「正規表現」が出てく るだけで引いてしまう方もいらっしゃるでしょう。私もそうでしたから気持ち は良くわかります。 私も引いていたのですが、Ruby では、「文字列」「配列」「ハッシュ(Hash)」 「正規表現」は基本的なデータ構造として統一的に取り扱われているので、自 然になじんでしまうのです。 Javaも J2SDK1.4 でやっと正式サポートされました。それ以前は、不自由して いた訳ですが、避けては通れなくてやっと対応されました。 では、正規表現の世界に、きちんと入ってみましょう。 正規表現の世界は、ひとつの世界ですからはじめに敷居があります。 言語でまず単語を覚えないとはじまらないように、正規表現でも、まずメタ文 字を覚えなければなりません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ メタ文字一覧 (切り取って 座右の友にしませう^^) ─────────────────────────────────── ─────────────────────────────────── 代表文字 ─────────────────────────────────── . 改行を除く任意の一文字とマッチ 文字クラス指定。[a-z] はa からz までのいずれか [^] 文字クラス指定の逆。[^a-z] はa からz 以外の文字 \w 英数字。[0-9A-Za-z_] と同じ \W 非英数字 \s 空白文字。[\t\n\r\f] と同じ \S 非空白文字 \d 数字。[0-9] と同じ \D 非数字 ─────────────────────────────────── 繰り返し ─────────────────────────────────── * 直前の表現の0回以上の繰り返し + 直前の表現の1回以上の繰り返し ? 直前の表現の0または1回の繰り返し {m,n} 直前の表現のm回からn回の繰り返し *? 直前の表現の0回以上の繰り返し(最短一致) +? 直前の表現の1回以上の繰り返し(最短一致) ?? 直前の表現の0または1回の繰り返し(最短一致) {m,n}? 直前の表現のm回からn回の繰り返し(最短一致) ─────────────────────────────────── アンカー 特定の文字ではなく、場所にマッチするメタ文字 ─────────────────────────────────── ^ 行頭にマッチ $ 行末にマッチ \A 文字列の先頭にマッチ \Z 文字列の末尾(改行があればその直前)にマッチ \z 文字列の末尾にマッチ \b 語境界文字(範囲指定外) \B 非語境界文字 \b 後退(0x08) (範囲指定[]内) ─────────────────────────────────── 位置指定 (場所が正規表現によって指定される) ───────────────────────────────────
選択 |