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を掲げてVBASPの梯子をはずしてしまうし、JavaJSFの登
場で現状環境の変革は余儀なくされるわけです。ソフト開発環境の賞味期限は切
れて行くわけで、開発環境に何を選ぶかは、まあどの株を買うかというようなも
のかもしれません。

勝ち馬に乗らないといけないし、将来性もきちんと見据えなければなりません。
20年前と変わっていないことは、たぶん20年後も変わっていないでしょう。
10年前と変わっていないことは、たぶん10年後も変わっていないでしょう。
Rubyは、1993年にオブジェクト指向言語として生まれて、着々と成長してい
ます。今年は次期Ruby=Ruby2の話が本格化するようです。注2)

前回「続Ruby でファイル操作入門」注3)にて標準入出力、リダイレクト、文字
コード変換、ファイルの書き込みを話題にしました。『レシーバ』の理解が、オ
ブジェクト指向言語の使用でポイントになります。これをやさしい Ruby で理解
すると敷居の高い(ところもある)ActionScriptで敷居を乗り越えやすくなりま
す。ActionScriptを難しいと感じている方は、Rubyオブジェクト指向のスキル
を磨くのが有利かも。

今回は、コード変換を復習してから、久しぶりに ActionScriptのコードも交え
入力チェックを話題にして正規表現に話しをすすめます。

Webでも、正規表現が使えると楽しい世界が広がります。

ノートPCにWindowsXPという環境で、どんどん楽しいプログラムを進めましょう。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ コード変換 復習
────────────────────────────────────
はじめに、前回、コード変換フィルタの話しをしました。ちょっと復習しておき
ます。

LinuxUnixでの EUC のファイルを WindowsShift_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) (範囲指定[]内)
───────────────────────────────────
位置指定 (場所が正規表現によって指定される)
───────────────────────────────────
選択
( ) 表現のグループ化 \1、\2 後方参照(n 番目の括弧に対応する) (?: ) 表現のグループ化(後方参照なし) (?= ) パターンによる位置指定(幅を持たない) (?! ) パターンの否定による位置指定(幅を持たない) (?# ) コメント ─────────────────────────────────── マッチ結果を表す変数 ─────────────────────────────────── $& マッチした部分 $1、$2、...、$n n 番目の括弧に当てはまる部分 $+ 最後の括弧に当てはまる部分 $` マッチより前の部分 $' マッチより後の部分 $~ マッチ情報 ─────────────────────────────────── ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 正規表現の例 ─────────────────────────────────── Rubyでは、正規表現とのパターンマッチングの正道な書き方は、 正規表現 =~ 文字列 となります。パターンがマッチすると式の評価は True になります。 文字列 =~ 正規表現 も利用は、可能ですが。 正規表現は /パターン/ で表記します。 では早速数字入力チェックの例です。input はチェックしたい文字列です。 /+[1234567890]/ =~ input []で囲まれたらその中のどれか1文字という意味になります。 + は1回以上の繰り返し これは /+[0-9]/ =~ input と書けます。さらにメタ文字を使うと /+\d/ =~ input と書いても同じです。 では、年月日をチェックするにはどうしますか? 西暦4桁年で例えば2004年3月30日が "20040330"(固定長)であれば /[12]\d\d\d[01]\d[0123]\d/ =~ input 次に年月日の区切りに"-"ハイフンが使われて "2004-3-30"(長さ可変)であれば どうなるでしょうか? 少し性急ですが、可変長な表現に挑戦です。いろいろ考慮する必要があるので はじめは難しく感じるかもしれません。 /^[12]\d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[12]\d|3[01])$/ =~ input いかがでしょうか? ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ まとめ ──────────────────────────────────── 今回は コード変換を復習してから、久しぶりに ActionScriptのコードも交え 入力チェックを話題にして正規表現を解説しました。 『正規表現』は、まずメタ文字を覚える事です。それで世界が広がります。 書籍注6)やサイト注7)も参考になりますので是非どうぞ。 またまたいろいろな要素が出てきましたね。一歩一歩進みましょう。 また 次回をお楽しみに。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ※ 注釈、資料、参考情報 ──────────────────────────────────── 注1) Macromedia,WWWアプリのUIフレームワークFlex」を発表 http://itpro.nikkeibp.co.jp/free/ITPro/USNEWS/20040330/142104/ Flashが標準クライアントになる日 http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20040330/142131/ 注2) Lightweight Language Magazine http://www.ascii.co.jp/books/detail/4-7561/4-7561-4441-1.html Ruby2 http://www.rubyist.net/~matz/slides/rc2003/mgp00009.html 注3) 続 システムはオブジェクト指向 Ruby & Flash (#005) Ruby でファイル操作入門」 改訂後 http://ns1.fsys.net/tubo/webtubo20040318.txt 改訂前 http://www.melma.com/mag/02/m00020302/a00000723.html 注4) 吉田さんの Unicode 変換用拡張モジュール http://www.yoshidam.net/uconv_ja.txt 注5) 2003.10.30【 実践編 】LoadVars連携での ログイン認証 http://www.melma.com/mag/02/m00020302/a00000651.html 注6) Ohmsha オーム社 「Ruby Magic Rubyで極める正規表現http://www.ohmsha.co.jp/data/link/4-274-06488-3/ 注7) チュートリアル: 正規表現 - オブジェクト指向言語Ruby http://www.ruby-lang.org/ja/20020314.html 【プロフィール&近況】 今週末は、お花見日よりですな。どこかでお会いできるかも^^ 福井 修 ( FUKUI Osamu )o-fukui@po.iijnet.or.jp 福井システムリサーチ http://fsys.net/ 主幹。システム構築歴27年。 システム構築エキスパート 日本Linux協会、神戸商工会議所情報処理学会、関西IT共同体 会員 関西ソーホ・デジタルコンテンツ事業協同組合デジタルハリウッド神戸校 Java講師