「初めてのRuby」 4章 文字列(その2)

4.3 正規表現
メタキャラやオプション、キャプチャなど、Perlで慣れた方法で一通り書ける。
Ruby 1.9から使われている鬼車ライブラリは名前付きキャプチャもできる賢い子!

# -*- coding: utf-8 -*-

today = "2012/02/29 Wed 寿司食べたい"

if /^\d{4}\/02/ =~ today   #=>2月の場合はマッチ
    puts "February"
end

if %r!^\d{4}\/02! =~ today #=>↑を%記法で書いた
    puts "February"
end

if /wed/i =~ today         #=>iオプションで大文字/小文字を無視
    puts "水曜日"
end

if /^(\d{4})\/(\d{2})\/(\d{2}).+寿司/u =~ today
#=>uオプションによりUTF-8の"寿司"にマッチ。キャプチャもできる。
    puts $1 + " 年 " + $2 + " 月 " + $3 + " 日はお寿司の日!"
end

if /^(?<year>\d{4})\/(?<mon>\d{2})\/(?<day>\d{2}).+寿司/u =~ today
#=>↑をRuby 1.9から使える名前付きキャプチャで書いた
    puts year + " 年 " + mon + " 月 " + day + " 日はお寿司の日!"
end

調べたらPerlも5.10からは名前付きキャプチャが正式サポートされてた。
(仕事じゃ5.8使ってるから使う機会は少なそうだけどw)

4.4 部分文字列へのアクセス
文字列に添字演算子[]を付けることで、文字列の一部を取り出せる。
(面倒なのでRuby 1.9の例のみ)

# -*- coding: utf-8 -*-

lunch = <<"EOS"
02/27 タイ料理
02/28 中華料理
02/29 黒豚しゃぶしゃぶ
EOS

print lunch[6], lunch[7], lunch[8], lunch[9]
                            #=>タイ料理(一文字ずつ位置を指定)
print lunch[6, 4]           #=>同(開始位置と長さを指定)
print lunch[6..9]           #=>同(最後の文字を含む範囲指定)
print lunch[6...10]         #=>同(最後の文字を含まない範囲指定)
print lunch[/.{2}料理/u]    #=>同(正規表現で指定)

print lunch[-9], lunch[-8]  #=>黒豚(末尾から一文字ずつ位置を指定)
print lunch[-9, 2]          #=>同(末尾からの位置と長さを指定)

4.4.1 更新
指定した文字を変更する方法色々。

# -*- coding: utf-8 -*-
lunch = "タイ料理,中華料理,しゃぶしゃぶ"

lunch["しゃぶしゃぶ"] = "黒豚しゃぶしゃぶ"
puts lunch
#=>タイ料理,中華料理,黒豚しゃぶしゃぶ(指定した文字列を変更)

new_lunch = lunch.gsub(/料理/u, "飯")
puts new_lunch
#=>タイ飯,中華飯,黒豚しゃぶしゃぶ(全てのマッチする文字列を変更)

lunch.gsub!(/料理/u, "飯")
puts lunch
#=>タイ飯,中華飯,黒豚しゃぶしゃぶ(↑の破壊的なバージョン)

lunch.gsub!(/タイ料理/u, "パッキーマオ")
lunch.gsub!(/中華料理/u, "ワンタン坦々麺")
puts lunch
#=>パッキーマオ,ワンタン坦々麺,黒豚しゃぶしゃぶ(今日までの昼飯)



例を書くのに考えすぎて眠くなってきたのでここまで。。