http://www.sw.it.aoyama.ac.jp/2011/PB2/lecture13.html
© 2011-12 Martin J. Dürst 青山学院大学
1月19日 (木曜日3限、補講): 14回目の授業 (補講についての注意)
期末試験: 1月23日 (3限、13:10-14:10)
期末試験の内容:
過去問: 2010年度
inject
group_by
提出: 12月23日 (金曜日) 22:00 までに Moodle に
famous_stats.rb
のファイル名で投稿
有名人のデータから次の統計を計算し、出力しなさい。
注意: 肥満度ごとにプログラムをコピペしないで、イテレータを使う
ヒント:
group_by
で肥満度ごとに分割inject
で体重などの合計を計算発展問題: 平均を計算できる関数を作って使う
正解例: famous_stats.rb
これから自分が書きたいプログラムの概要・応用を文書 (.txt ファイル) で説明しなさい。
条件:
授業全体の内容を復習し、分からない部分をリストアップ
(regular expression)
if height_text =~ /^[0-9]+(cm)?$/
height_text
に一つ以上の数字の後に cm
が含まれている場合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 ... =~ ...
と同じ/Ruby/.match('Hello Ruby!')
MatchData
クラスのインスタンス
文字列.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
のファイル名で投稿
有名人のデータから正規表現を使って特殊な有名人を探し出してください。例:
その他や複数のものも可能。何を出力するのか出力に明記しなさい。