静岡理工科大学 菅沼ホーム Ruby 目次 索引

正規表現

  1. 正規表現とは
  2. メタ文字
  1. 正規表現とは

      正規表現regular expression )とは,文字列の集合を一つの文字列で表現する方法の一つです.例えば,”book”と”cook”という 2 つの文字列を,正規表現を使用して”[bc]ook”という 1 つの文字列で表現できます.なぜなら,[bc] は,正規表現において,「 b か c かどちらか 1 文字」ということを意味しているからです.Java,Perl,PHP などの言語は正規表現を扱うことができるため,パターンマッチを行うプログラムを容易に作成することができます.

       正規表現では,「複数の文字列を一つの形式で表現する」ために,いくつかの文字に対して特別な意味を与えています.これらの文字を,「メタ文字」と呼んでいます.メタ文字と普通の文字を区別するために,Ruby では以下に示すような規則を設定しています.

    • \ を伴わない英数字はメタ文字ではない.
    • \ を伴う記号はメタ文字ではない( `\*' は「繰り返し」でなく「アスタリスク」を表す)

      正規表現も,Ruby ではオブジェクトの一つです( Regexp クラスのインスタンス).正規表現オブジェクトは,どのような文字とマッチするのかを表すパターンを正規表現で定められた規則に沿って記述し,スラッシュで囲んで表します.例えば,先の例の場合は,

    /[bc]ook/

    となります.なお,以下に示す例のように,%r%記法)を使用して,スラッシュの代わりに別の記号を使用することも可能です.

    %r{[bc]ook}
    %r![bc]ook!

      正規表現の最後の / の直後の文字は,正規表現に対するオプションになります.例えば,

    /[bc]ook/i

    では,大文字と小文字を区別しません.オプションには,以下に示すようなものがあります.

    • i  正規表現はマッチ時に大文字小文字の区別を行わない
    • o  一番最初に正規表現の評価が行われた時に一度だけ式展開を行う
    • x  正規表現中の空白(改行も含む)を無視する.また,バックスラッシュでエスケープしない # から改行までをコメントとみなして無視する.
    • m  複数行モード.正規表現「 . 」が,改行にもマッチするようになる.

      正規表現オブジェクトが対象の文字列にマッチしているかどうかを調べるために,=~ 演算子が用意されています.

    正規表現オブジェクト =~ string  # 「string =~ 正規表現オブジェクト」も可

    のように記述し,正規表現オブジェクトが右辺の文字列オブジェクトにマッチした場合には,マッチした位置のインデックスを返します.インデックスは対象の文字列の先頭の文字位置を 0 とし,パターンにマッチした最初の文字の位置です.マッチしなかった場合は nil が返されます.例えば,先の例を irb を使用して実行すると以下に示すような結果が得られます(以下の例においても同様ですが,ここでは,irb によって実行した結果を示します).

    /[bc]ook/ =~ "textbook" # => 4
    /[bc]ook/ =~ "textbooj" # => nil

      正規表現オブジェクトを作成するには Regexp クラスの new メソッドを使っても可能です.例えば,例に示したオブジェクトと同じオブジェクトを生成するためには,

    str = Regexp.new("[bc]ook")

    のようにして行います.

  2. メタ文字

静岡理工科大学 菅沼ホーム Ruby 目次 索引