正規表現の活用

regexp いくつかの関数呼出

0 概要

1 基礎

正規表現 マッチング

主なルール 限量子

主なルール

文字クラス [0-9] または \d
その繰り返し [0-9][0-9]*, [0-9]+,  \d+
(いずれも同じ意味)
* 直前の表現の0回以上の繰り返し
+ 直前の表現の1回以上の繰り返し
(これらは量指定子または限量子と呼ばれ、
 直前の表現を修飾する形で使われる;右図参照)
アンカー
$ (アンカー)マッチ対象の 先頭^ と 末尾 $(下図)
() で囲んだもの 後で $1 $2 などの文字で参照できる(後方参照)

主なメタ文字 アンカー
アンカー2

使い方

/ … / : スラッシュで囲む
/ … / =~ line : 演算子 =~ を使って 対象文字列とのマッチング

正規表現リテラル 文字列 と 正規表現(で 書かれた「パターン」) との間の 「マッチング」が試みられる

例:

”alphabet” =~ /ab/
# 文字列の中に ab という文字の並びがあるかどうか 

マニュアルのチェックしておくこと。
正規表現リテラル%r記法正規表現=~ 演算子(メソッド)

簡単な練習(irbで)

s="abcdefg"
s=~/a/          => 0     a が見つかる(0文字目に)
s=~/ef/          => 4
s=~/x/          => nil     見つからない(マッチしない)

文字の呼び方

niko caret

^ キャレット(caret) 山型記号
$ ダラー
~ チルダ(tilde) にょろ

その他の文字も「特殊記号 読み方」などで検索すれば情報が得られます (例えばこのページ)。

2 実習

実習の準備

サンプルデータファイルをダウンロード
(自分がコマンドプロンプトで作業をする予定の場所 に 保存する
 ファイル名は WORDS.txt とする)
コマンドプロンプトで irb を起動する
(以下は irb上での作業)

(w=IO.readlines('WORDS.txt').map{|e|e.chop}).size
# これで 配列 w(正確には 変数wが保持するArrayオブジェクト)に
# 2万数千個の英単語(String型)が入っている

または

(w=open('WORDS.txt'){|f|f.gets(nil).split}).size
(w=IO.foreach('WORDS.txt').map &:chop).size
(w=IO.read('WORDS.txt').split).size
# というふうにいくつかの書き方がある

w.grep(/X/) 
w.grep(/abc/)

などで その中からパターンにマッチする単語を抜き出して表示する。
出力されるものが多すぎる(ために画面が流れていってしまう)時は、

w.grep(/a/).size

などで そのマッチした数だけ表示させてみるといい

パターンの練習

以下の条件を満たす単語がいくつあるか調べて見る

  1. 10文字の単語(11 12等についても)
    or 10文字以上の単語
  2. すべて大文字から成る単語
  3. 数字を含む単語
  4. 英数字以外の文字を含むもの
  5. e(E) で始まりe(E)で終わるもの(ケースを区別しないマッチ)
  6. 最初の文字と最後の文字が同じもの
  7. 最後の2文字が最初の2文字の逆転になっているもの
  8. barbar のように 同じ並びの繰り返しになっている単語

hint:キャプチャ


解答のページはあとで(しっかり考えてから)見てください。