最初に作成した meibo.txt
のデータ
サトウ ムネユキ SATOH Muneyuki さとう胸幸 青葉台 ナカマチ タロウ NAKAMACHI Taro 中町太郎 酒田 イイモリ ハナコ IIMORI Hanako 飯森花子 飯森山 サイトウ テツヤ SAITOH Tetsuya 斎藤徹夜 白夜の国 ゲゲノ キタロウ GEGENO Kitarou 下々野喜太郎 魔界村 ナニワノ タロー NANIWANO Taro 浪花之太朗 探偵騎士王国 ヒミ ヨンタロウ HIMI Yontarou 悲見四太郎 甲子園 ヤマタイ ヒミコ YAMATAI Himiko 邪馬台氷見子 大和 イモリ テツコ IMORI Tetsuko 井森徹子 井戸
を利用して、いくつか検索練習してみよう。
利用するプログラムは、さきほどの
saito.rb
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- while line=gets if /sai?toh/i =~ line print line end end
だと決まったパターンしか検索できないので以下のように変更しよう。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- print "検索パターン: " pattern = STDIN.gets.chomp! regexp = Regexp.new(pattern, nil) while line=gets if regexp =~ line print line end end
プログラム中の、STDIN
は標準入力を意味する。
Rubyプログラム起動時にファイルを引数に与えると gets
を利用
したときにそのファイルからデータを読む。しかし、STDIN.gets
とすると、ファイルを引数に与えたとしても標準入力から1行読む。
これを、chomp!
で
改行を切り取り、さらに Regexp.new
メソッドに渡して正規表現
にしている。
ひらがなは正規表現 [ぁ-ん]
で表現できる。
./meibosearch.rb meibo.txt 検索パターン: [ぁ-ん] サトウ ムネユキ SATOH Muneyuki さとう宗幸 青葉台 サイトウ テツヤ SAITOH Tetsuya 斎藤徹夜 白夜の国
ちいさい「ぁ」は la (えるえー)で入力する。
行の先頭は ^
で指定する。^サ
とすると
行の先頭が「サ」で始まるもののみにマッチする。
./meibosearch.rb meibo.txt 検索パターン: ^サ サトウ ムネユキ SATOH Muneyuki さとう宗幸 青葉台 サイトウ テツヤ SAITOH Tetsuya 斎藤徹夜 白夜の国
グルーピングを使うと繰り返しを記述できる。空白以外の文字は
\S
である。これを括弧でグルーピングして、\数字
で参照すればよい。正規表現は (\S)\1
となる。
./meibosearch.rb meibo.txt
検索パターン: (\S)\1
イイモリ ハナコ IIMORI Hanako 飯森花子 飯森山
ゲゲノ キタロウ GEGENO Kitarou 下々野喜太郎 魔界村
「イ」と「ゲ」が2字連続で出てくるのでこれにマッチする。
苗字は行頭なので ^
記号で絞り込みできるが、
下の名前は行の途中なので絞り込めない。苗字と下の名前の区切りに
スペースがあることを利用し、
行頭 + 苗字 + 空白 + 下の名前
というパターンを記述する。苗字は単語だったら何でも構わないので
「1文字以上の非空白文字」を意味する \S+
で
マッチングさせる。下の名前は「ヒミ」が最初に来ても最後に来ても
途中に来ても、「ヒミ」全部でもよいようなパターンを指定するので
\S*ヒミ\S*\b
とする。
./meibosearch.rb meibo.txt
検索パターン: ^\S+\s+\S*ヒミ\S*\b
ヤマタイ ヒミコ YAMATAI Himiko 邪馬台氷見子 大和
ちなみに「ヒミを含む」という部分のパターンを
.*ヒミ.*
などとしてしまうと、1つめの.*
の部分で空白を越えてマッチする可能性があるため、マッチした「ヒミ」が
必ずしも下の名前の位置にあるとは限らなくなってしまう。
名簿を見ると「タロウ」と「タロー」がいるので、「タロ」の
次が「ウ」でも「ー」でもマッチするよう タロ[ウー]
とする。ただし名前の途中にそれらが含まれるものは除外したいので
単語境界を意味する\b
で絞り込みを行なう。
./meibosearch.rb meibo.txt
検索パターン: \bタロ[ウー]\b
ナカマチ タロウ NAKAMACHI Taro 中町太郎 酒田
ナニワノ タロー NANIWANO Taro 浪花之太朗 探偵騎士王国