正規表現教材

  1. 正規表現について
  2. 正規表現のメタ文字について
  3. 例題プログラム

正規表現について

データから文字・文字列を検索するときにそれらのパターンを指定する一般的な表現方法を正規表現といいます。
調べたい文字・文字列が正規表現によってすぐに検索することができます。

例えば、i(小文字)が含まれる文字・文字列の場合以下のように検索されます。
:i, programming, Application(小文字のiが含まれるので検索される。)
×:I, Image(大文字のIなので検索されない。)

moji.csv

moji
i
programming
Application
I
Image

kensaku1.rb

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

例題プログラム

kensaku.csv

name,gakko,gakunen,kozukai
公益太郎,三川八中,2,2000
飯森花子,余目百中,1,4000
鶴岡一人,タキタロウ小,4,200
鶴岡二子,タキタロウ小,2,300
遊佐梅子,丸池小,6,900

kensaku2.rb

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

正規表現を使ったプログラムを作成してみよう!!