データから文字・文字列を検索するときにそれらのパターンを指定する一般的な表現方法を正規表現といいます。
調べたい文字・文字列が正規表現によってすぐに検索することができます。
例えば、i(小文字)が含まれる文字・文字列の場合以下のように検索されます。
○:i, programming, Application(小文字のiが含まれるので検索される。)
×:I, Image(大文字のIなので検索されない。)
moji
i
programming
Application
I
Image
require 'csv'
data = CSV.read("moji.csv", headers: true)
data.each do |row|
if /i/ =~ row["moji"]
puts row["moji"]
end
end
プログラムの解説
正規表現:/(スラッシュ)で囲みます。
=~:正規表現と文字列のマッチを行います。
文字・文字列以外に正規表現内で特殊な働きをする文字(メタ文字)で検索することができます。
例えば
というようにメタ文字を組み合わせることで複雑なデータを検索することができます。
※+と\dについては次の「主なメタ表一覧」を見て、マッチする文字列は何なのか、どのような例があるのか確認してみましょう。
メタ文字 マッチする文字列 . なんでもいい1文字(改行を含まない) * 直前の文字0回以上の繰り返し + 直前の文字1回以上の繰り返し ? 直前の文字0回もしくは1回の繰り返し 文字列1|文字列2 どちらかにマッチすれば良い \ 直後のメタ文字を文字としてマッチさせる \s 空白文字(スペース、タブ、改行など) \S 空白文字以外 \d 0〜9の数字 \D 0〜9の数字以外
メタ文字 正規表現 マッチする マッチしない . /o.k/ book back * /.*on/ nippon japan + /-+/ o-------i oi ? /ts?u/ tsu, tu su 文字列1|文字列2 /cat|dog/ cat, dog fox \ /\+/ 10+1 10-1 \s /e\sa/ We are Weare \S /a\Su/ aisatu aisa tu \d /\dsai/ 15sai juugosai \D \/Dsai/ Juugosai 15sai
name,gakko,gakunen,kozukai
公益太郎,三川八中,2,2000
飯森花子,余目百中,1,4000
鶴岡一人,タキタロウ小,4,200
鶴岡二子,タキタロウ小,2,300
遊佐梅子,丸池小,6,900
require 'csv'
data = CSV.read("kensaku.csv", headers: true)
puts "学校で探す:1"
puts "金額で探す:2"
print "どれにしますか:"
sel = gets.to_i
if sel == 1
print "探したい学校名を入れてください:"
ptn = Regexp.new(gets.chomp)
#gets.chompで入力された文字列をRegexp.newにより正規表現に直す
data.each do |row|
if ptn =~ row["gakko"]
printf("%sさんは%s%s年です\n", row["name"], row["gakko"], row["gakunen"])
end
end
elsif sel == 2
print "絞り込みしたい金額を入れてください:"
gaku = gets.to_i
data.each do |row|
if gaku < row["gozukai"].to_i
printf("%sさんは%d円もらっています\n", row["name"], row["kozukai"].to_i)
#csvから読んできたデータは全部文字列
#数字で比較するときは.to_iや.to_fを使う
end
end
else
printf("%d番はありません。さようなら。\n", sel)
end
正規表現を使ったプログラムを作成してみよう!!