教科書 P.54 で説明
具体例で説明する。 名簿データを以下に示す。 カットアンドペーストで ``meibo.txt''に保存する。
サトウ ムネユキ SATOH Muneyuki さとう胸幸 青葉台 Aobadai 03-0300-3030 mune@yoko.jp ナカマチ タロウ NAKAMACHI Taro 中町太郎 酒田 Sakata 012-345-6789 ntaro@sekai.jp コウゲイ ハナコ KOUGEI Hanako 工芸花子 飯山 Iiyama 098-765-3210 hana@kodai.ac.jp イイモリ ハンコ IIMORI Hanko 飯森判子 飯森山 Iiyamamori 046-789-0987 han@hate.com サイトウ テツヤ SAITOH Tetsuya 斉藤徹夜 白夜の国 Byakuyanoyoru 007-007-0077 tetsu@shiroi.com ゲゲノ キタロウ GEGEGENO Kitarou 下々野喜太郎 魔界村 Makaimura 03-0000-00000 kita@oyaji.com ボブ サップ Bob Sappu 母父察歩 リング ring 0722-32-3909 bob@ring.com サトウ ノコハン sato NoKohan 砂糖鋸半 食物村 Tabemonomura 03-1031-0310 noko@meshi.jp ナニワノ タロー NANIWANO Tarod 浪速飲太郎 探偵騎士王国 Tanteikishiouk 046-007-7007 ntaro@king.jp シカクイ ハココ shikakui hakoko 四角井 箱子 倉庫 Shikakui Souko 06-4912-5012 hako@sekai.com ヒミ ヨンタロウ HIMI Yontarou 非見四太郎 甲子園 Koushien 919-922-3333 4taro@rokko.tiger.jp ヤマタイ ヒミコ YAMATAI Himiko 邪馬台氷見子 大和 Yamato 03-1313-1313 himi@yamatai.com イモリ テツコ IMORI Tetsuko 井森徹子 井戸 Ido 010-1010-1000 teko@ana.hori.com バブ カオウ Bab Kaoh 場分 花王 泡の国 Awanokuni 009-0808-92295 bab@kaoh.seken.com イサ ミアシ Isa Miashi 伊佐 実亜士 土俵 Dohyo 03-1330-4024 isami@sumo.ne.jp アサヲ タタロウ Asawo Tatatou 麻生 多太郎 政界 Seikai 0303-9876-5432 asao@nagata.cho.com
``Taro''がファイルのどこに含まれているか調べるのに正規表現は便利である。 ターミナル上で、
$ egrep -n "Taro" meibo.txt 2:ナカマチ タロウ NAKAMACHI Taro 中町太郎 酒田 Sakata 7:ナニワノ タロー NANIWANO Taro 浪速飲太郎 探偵騎士王国 Tanteikishioukoku実行してみると、このようになる。すなわち、2行目の7行目に ``Taro''がいる ことが分かる。 ``-n''というのは、行番号を表示するオプション。
rubyでは、プログラム中でどのように正規表現をあわらすか? 以下のように、p.58のプログラム ``saito.rb''を打ち込んで、実行してみる。
------------program Start --------- while line = gets #ファイルを引数とすると、ファイルから1行ずつ読み込む if /SAI?TOH/ =~ line print line end end ------------Program End -----------1行目の ``line = gets''というのは、プログラム実行時にファイルを引数 とすると、そのファイルから読み込む。while文なので、1行目から順次読み込み、 読むべきデータが無くなると、終了する。
``/SAI?TOH/ =~ line'' が正規表現にマッチしているかどうか判断して いる部分である。
教科書の例は ``/sai?toh/i =~ line''となっており、後ろの / の後にある i は、大文字と小文字を区別しないと言う事を表している。
``if''文により、マッチした場合のみ print 文が実行される。
ピリオド | . | 任意の一文字(なんでもよい一文字) |
クエスチョン | ? | 直前の文字が0または1回の繰り返し |
アスタリスク | * | 直前の文字が0回以上の繰り返し |
プラス | + | 直前の文字の1回以上の繰り返し |
大カッコ | [ ] | カッコの中に書いた文字のどれか |
キャレット | ^ | 文字列の先頭をいみする |
ドル | $ | 文字列の末尾を意味する |
縦棒(パイプ) | ![]() |
縦棒で区切られた部分のいずれか |
小カッコ | ( ) | グルーピング、数文字をひと固まりとして処理する |
![]() |
アルファベット、数字、アンダーバーのどれかにマッチする | |
![]() |
アルファベット、数字、アンダーバー以外にマッチする | |
![]() |
![]() |
|
![]() |
![]() |
|
![]() |
単語の境界にマッチする | |
![]() |
空白文字にマッチする | |
![]() |
空白文字以外にマッチする |
------------program Start --------- while line = gets if /ハ.コ/u =~ line # 日本語はUNICODE文字なので、オプション"u"を付ける print line end end ------------Program End -----------
------------program Start --------- while line = gets if /Hana?ko/ =~ line print line end end ------------Program End -----------
------------program Start --------- while line = gets if /B[ao]b/ =~ line print line end end ------------Program End -----------
------------program Start --------- while line = gets if /ハ(ナ|ン)コ/ =~ line print line end end ------------Program End -----------