http://www.sw.it.aoyama.ac.jp/2010/PB2/lecture13.html
© 2011 Martin J. Dürst 青山学院大学
14回目の授業: 1月18日 (火曜日) 3時限 (補講)
期末試験: 1月24日 (13:10-14:10)
期末試験の内容:
inject
group_by
提出: 12月24日 (金曜日) 22:00 までに Moodle に
famous_stats.rb
のファイル名で投稿
有名人のデータから次の統計を計算し、出力しなさい。
注意: 肥満度ごとにプログラムをコピペするのではなく、繰り返し (イテレータ) を使う
発展問題: 平均を計算できる関数を作って使う
正解例: 都合により削除
これから自分が書きたいプログラムの概要・応用を文書 (.txt ファイル) で説明しなさい。
条件:
授業全体の内容を復習し、分からない部分をリストアップ
(regular expression)
if height_text !~ /^[0-9]+(cm)?$/
hight_text
に一つ以上の数字の後に
cm
が含まれてない場合text = text.gsub /[Pp](erl|ython|HP)/, 'Ruby'
text
内の Perl、Python、PHP を全て Ruby
に置き換える/.../
で、/
に挟む/.../
の後オプションとして文字が来る可能性がある/.../i
で大文字・小文字の差を無視).
,
|
, +
, *
, ?
,
(
, )
, [
, ]
,
{
, }
, ^
, $
,
-
, \
\
を付ける/[0-9]+\.[0-9]+/
小数点数で、小数点は
.
は特殊文字なので \
を使用)^
:
文字列の先頭だけでマッチを試みる$
:
文字列の終わりだけでマッチを試みる/^[0-9]+(cm)?$/
^
と $
がなかったら他に変なものがないか感知できない)/Ruby/
は文書内に Ruby の文字列を感知)\
を付ける.
は一文字にマッチ (どの文字でもいい)[abc]
は []
内のいずれかの文字 (この場合、a、b 又は c)
だったらマッチ[Pp]
大文字か小文字の P)[0-9]
はその間の全ての文字にマッチ
(例の場合、[0123456789]
と同様)[a-z]
は半角小文字、[A-Z]
は半角大文字)[...]
で表されているものは文字クラスと呼ぶ+
では一回以上マッチ/^R+$/
は
'R'
、'RR'
、'RRR'
、'RRRR'
などにマッチ)*
では 0 回以上マッチ/^R*$/
は
''
、'R'
、'RR'
、'RRR'
、'RRRR'
などにマッチ)?
では 0 回又は 1 回マッチ/^R?$/
は ''
と 'R'
にマッチ)()
で囲まれた正規表現の部分=~
でチェック/Ruby/ =~ 'Hello Ruby!'
→ 6)nil
/Ruby/ =~ 'Hello World!'
→ nil
)正規表現 =~ 文字列
も
文字列 =~ 正規表現
も同じ!~
は not ... =~ ...
と同じ文字列.sub(正規表現,
置き換え文字列)
文字列.gsub(正規表現,
置き換え文字列)
g
は
global の意味)次の文を irb
に入れ、正規表現とその使い方を試してみてください。
/abc/.class
/ruby/ =~ 'ruby'
/^ruby$/ =~ 'ruby'
/ruby/ =~ 'Ruby'
/ruby/ =~ 'Hello, ruby is great!'
/^ruby/ =~ 'Hello, ruby is great!'
/ruby/ =~ 'Hello, Ruby is great!'
/ruby/i =~ 'Hello, Ruby is great!'
/[Rr]uby/ =~ 'Hello, Ruby is great!'
'Perl and Python are great!'.sub /[Pp](erl|ython|HP)/,
'Ruby'
'Perl and Python are great!'.gsub /[Pp](erl|ython|HP)/,
'Ruby'
ヒント: irb
内にカーソルキー(←↑→↓)
を使って、長い例を全部再入力しないようにする
次の正規表現のマッチする文字列とマッチしない文字列
(それぞれ二個以上) を irb
を使って見つけなさい。
/^Hello$/
/^Hel+o$/
/^Hel*o$/
/^Hell+o$/
/^Hell?o$/
/^He(ll)+o$/
/^He(ll)+o$/
/^He(l+o)+$/
他にもいろいろ試してみてください。
提出: 1月18日 (火曜日) 22:00 までに Moodle に
famous_regexp.rb
のファイル名で投稿
有名人のデータから正規表現を使って特殊な有名人を探し出してください。例:
その他や複数のものも可能。何を出力するのか出力に明記しなさい。