3.2. 文字列の変換(正規表現)


今回は正規表現に付いて説明します。

この正規表現の機能はrubyのひとつの売りになっている機能です。 非常にさまざまな事ができるのですがここでは掲示板に使う部分でその1例を簡単に説明します。 まずはプログラムを見てみましょう。

-- HTML 始まり -- html321.htm

<html><body>

<form action="test321.cgi" method="POST">

<textarea name="senddata" cols=40 rows=5>

</textarea>

<input type="submit" value="送信">

</form> 

</body></html>

-- プログラム 終わり --

-- プログラム 始まり -- test321.cgi

#!/usr/local/bin/ruby

print "Content-type: text/html\n\n"

require "cgi-lib"

input = CGI.new



CR = "\015"

LF = "\012"

EOL = CR + LF

BR = "<br>"



inputdata = input["senddata"]



changeddata = inputdata



changeddata = changeddata.gsub(/beforechange/, "afterchange")

changeddata = changeddata.gsub(/#{EOL}/, BR)

changeddata = changeddata.gsub(/#{CR}/, BR)

changeddata = changeddata.gsub(/#{LF}/, BR)



print "<html><body>"

print "inputdata = #{inputdata}<br>"

print "changeddata = #{changeddata}"

print "</body></html>"

-- プログラム 終わり --

今回のプログラムは2.3.のフォームのデータを受け取るで使った物を多少変更して使っています。

この二つのファイルをアップして実行属性を付けてください。
まずhtml321.htmをWeb上で見ます。
テキストボックスと送信と書いたボタンが出てきますので
テキストボックスに「beforechange」と入力して送信ボタンを押してください。
そうすると画面に
inputdata = beforechange
changeddata = afterchange
と表示されます。
プログラムの中で「beforechange」を「afterchange」と変換していることがわかります。
次にテキストボックスに
「1(改行)2(改行)3(改行)4(改行)」(改行と書いてある所は実際にリターンキーを打って改行してください)
と入力して送信ボタンを押してください。
そうすると画面に
inputdata = 1 2 3 4
changeddata = 1
2
3
4
と表示されます。
これはプログラムの中で改行コードを<br>に変換しているためにこのような結果が出ます。

次にtest321.cgiの内容を流れを追って説明します。
1〜4行はお決まりです。
6〜9行は定数に代入を行っています。
CR、LF、EOLは全て改行コードを意味しています。
使用するOSによって改行コードが変わってくるのでそれに対応しています。
BRにはHTMLのBRタグを入れています。

11行目ではフォームで送られてきた情報をinputdataに入れています。
13行目ではchangeddataにinputdataの中身を入れています。

15〜18行目で文字列の変換を行っています。今回のテーマはここなので注目してみてください。
15行目ではchangeddataの中にある"beforechange"を"afterchange"に変換しています。
16行目ではchangeddataの中にあるEOLの定数の中身と同じ文字列をBRの定数の中身と同じ文字列に変換しています。
17行目ではchangeddataの中にあるEOLの定数の中身と同じ文字列をBRの定数の中身と同じ文字列に変換しています。
18行目ではchangeddataの中にあるEOLの定数の中身と同じ文字列をBRの定数の中身と同じ文字列に変換しています。
このように変換には普通の文字列、変数(定数)など区別なく変換を行うことが出来ます。

20〜23行目で変換前のデータと変換後のデータを表示しています。


またもっとすごいことも出来ます。
test321.cgiの15行目を以下のように変更してください。

changeddata = changeddata.gsub(/b.*e/, "after")

さっきと同じようにして「before」という文字列をフォームから送信してください。
「after」と変化しましたね。
では次に「bee」という文字列をフォームから送信してください。
これも「after」に変化しましたね。

実はここでははじめに「b」がありその後に任意の文字列が0文字以上続き(何が入っていてもいいし、何にも無くてもいいという意味です。)その後に「e」という文字があったら、 「after」という文字列に変換しなさいという意味です。
このなかの「.*」は任意の文字列が0文字以上という事を表しています。
このような表現を正規表現と呼びます。
これは初めは意味不明の記号にしか見えずに難しいと思いますが、
使いこなせるようになるとこれが無くては生きていけない(笑)、というくらいに便利なものです。
「.」や「*」以外にもたくさんの表現があるのですがここでは言い尽くせないほどあるので正規表現を説明した本を読んでみたりするといいと思います。

今回は文字列変換、正規表現を説明しました。特に正規表現はこれからも多用していく事になると思うのでそのつど、学んでいくようにしましょう。
簡単に説明しましたがrubyのページでのユーザーガイドの方がわかりやすい気がします。
正規表現に興味のある方はユーザーガイドの正規表現を見てみましょう。

あと始めはここで紹介しているプログラムでgsub!を使っていたのですがそれではinputdataの中身も同時に変わってしまっていました。
(この表現は正しく無いなぁ。)
みなさんも破壊的なメソッドには気を付けましょう。
(って単なる私が無知だからって話も・・・。)


今回始めて使った命令など

| | メニュー戻る | |

LinkExchange Japan
LinkExchange Japan Member