To: ruby-05-16@e.koeki-u.ac.jp Subject: #05(2) 正規表現 Date: Mon, 19 May 2008 14:49:55 +0900 (JST) X-Mailer: Mew version 4.2 on Emacs 21.3.50 / Mule 5.0 (SAKAKI) ---- 氏名:SS 学籍番号:c1071279 クラス:D 1、作成したデータファイルdata.txtとその説明 宮城県出身の有名人 ヨシノ サクゾウ yosino sakuzou 吉野作造 マギー シンジ magisinji マギー審司 ササキ カヅヒロ sasaki kazuhiro 佐々木主浩 スガヤマ カオル sugayama kaoru 菅山かおる オオトモ アイ ootomo ai 大友愛 フクハラ アイ fukuhara ai 福原愛 モリタ トモミ morita tomomi 森田智己 アラカワ シズカ arakawa sizuka 荒川静香 イナガキ ジュンイチ inagaki junichi 稲垣潤一 タカハシ ジョージ takahasi joji 高橋ジョージ モリ クミコ mori kumiko 森公美子 スズキ キョウカ suzuki kyoka 鈴木京香 ナカムラ マサトシ nakamura masatosi 中村雅俊 カノ エイコウ kano eikou 狩野英孝 私は宮城県出身なので出身地の有名人に興味があり、このデータを作成した。 左から順に名前(カタカナ)、(ローマ字)、(漢字)、職種となっている。 2、作成したプログラムsearch.rb #!/usr/koeki/bin/ruby print "検索パターン: " pattern = STDIN.gets.chomp! regexp = Regexp.new(pattern, nil, "e") while line=gets if regexp =~ line print line end end 3、プログラムを動かして正規表現検索した結果 (1) 検索パターン: ^ス スガヤマ カオル sugayama kaoru 菅山かおる スズキ キョウカ suzuki kyoka 鈴木京香 (2) 検索パターン: ^[カ-コ] カノ エイコウ kano eikou 狩野英孝 (3) 検索パターン: mori.*mi モリタ トモミ morita tomomi 森田智己 モリ クミコ mori kumiko 森公美子 (4) 検索パターン: ジ$ タカハシ ジョージ takahasi joji 高橋ジョージ (5) 検索パターン: s(asaki|ugayama|uzuki.kyo).*ka ササキ カヅヒロ sasaki kazuhiro 佐々木主浩 スガヤマ カオル sugayama kaoru 菅山かおる スズキ キョウカ suzuki kyoka 鈴木京香 (6) 検索パターン: (sa|o)\1 ササキ カヅヒロ sasaki kazuhiro 佐々木主浩 オオトモ アイ ootomo ai 大友愛 (7) 検索パターン: (\S)\1 ササキ カヅヒロ sasaki kazuhiro 佐々木主浩 オオトモ アイ ootomo ai 大友愛 (8) 検索パターン: ^\w+\s+(シ|ジ)\w*\b マギー シンジ magisinji マギー審司 アラカワ シズカ arakawa sizuka 荒川静香 イナガキ ジュンイチ inagaki junichi 稲垣潤一 タカハシ ジョージ takahasi joji 高橋ジョージ 4、利用した正規表現の説明 (1)^ス ^は正規表現の先頭に指定したときに文字列先頭にマッチする。 つまりスから始まる文字にヒットする。 (2)^[カ-コ] ^(文字列先頭)が[カ-コ]カからコの範囲(カ、キ、ク、ケ、コ)にマッチ する文字にヒットする。 (3)mori.*mi . は任意の1文字にマッチ。 * は直前のパターンが0回以上現れる。 つまりmoriとmiの間にはなにが入ってもよいことを表していて、moriとmiの間 になにか文字が入ったものにヒットするようになっている。 (4)ジ$ $は正規表現の最後に指定したときに、文字列の末尾にマッチする。 つまりジで終わる文字列のみにマッチする。 (5) s(asaki|ugayama|uzuki.kyo).*ka まず()は長い正規表現の一部だけを括るときに使う。 |は「または」の意味。 .*は(3)参照。 よってsasaki〜kaまたはsugayama〜ka,suzuki(任意の1文字)〜kaに当てはま るものがマッチする。〜の部分は文字が入っても入らなくても良い。 (6)(sa|o)\1 \の後ろに数字(A)を続けると、元の正規表現の(A)番目の括弧にマッチした文 字列そのものに変えられる。 今回の場合は\の後ろに1がきているので"sasa"または"oo"が付くもののみに マッチする。 (7) (\S)\1 \Sは空白以外の文字を表している。 それを括弧で括りグルーピングし、\1を付けることで(6)同様に考える。 つまり1番目の括弧の\S(空白以外の文字)に\1が置き換えられるので"sasa"と "oo"にマ ッチした。 (8) ^\w+\s+(シ|ジ)\w*\b ^で文字列先頭にマッチ。 \wは英数字または日本語文字のどれか1字にマッチする。 +は直前のパターンが1回以上出現するという意味。 \sは空白文字にマッチ。 ()、|、*、については(5)、(3)参照。 \bは単語の境界で単語として独立したもののみにマッチする。 よって苗字 (スペース)名前の始めに "ジ" か "シ" が付く有名人を検索でき るようにした。 5、考察 授業で行った正規表現の特殊文字http://roy/~yuuji/2008/pf1/05/regex2.html を参考に正規検索を行った。 今回の課題では(5)と(8)を特に工夫した。 6、参考文献 *ウィキペディア フリー百科事典 宮城県出身の人物一覧 http://ja.wikipedia.org/wiki/%E5%AE%AE%E5%9F%8E%E7%9C%8C%E5%87%BA%E8%BA%AB%E3%81%AE%E4%BA%BA%E7%89%A9%E4%B8%80%E8%A6%A7より *2008年度 基礎プログラミングI #05 正規表現 http://roy/~yuuji/2008/pf1/05/index.htmlより 7、感想 今回の課題は今までやってきた中で、一番時間がかかり難しかった。特に検索に おいては、かな文字の検索はできたもののローマ字検索がいくらやってもできず、 大変だった。しかし慣れてくると特殊文字を使っての検索が面白く感じることが できたので良かったと思う。今後なにか問題が起きたときにその解決策がすぐに分かる ような技術をつけていけたらいいなと感じた。