━━━━━━━━━━━━━━━━━━━━━ 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) (範囲指定[]内)
───────────────────────────────────
位置指定 (場所が正規表現によって指定される)
───────────────────────────────────
( ) 表現のグループ化
\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講師