「=~」メソッドによるマッチング

広告

正規表現オブジェクトはパターンを定義するためのものです。作成された正規表現で表されるパターンに、対象となる文字列がマッチしているかどうかを調べるのが主な使い方となります。

正規表現オブジェクトが対象の文字列にマッチしているかどうかを調べるために、Regexpクラスでは「=~」メソッドが用意されています。

正規表現オブジェクト =~ string

オブジェクトが右辺の文字列オブジェクトにマッチした場合には、マッチした位置のインデックスを返します。インデックスは対象の文字列の先頭の文字を0とし、パターンにマッチした場合の先頭の文字の位置です。マッチしなかった場合は「nil」が返されます。

次の例を見てください。

p /abc/ =~ "abc"          # 0
p /abc/ =~ "pabc"         # 1
p /abc/ =~ "ppabc"        # 2
p /abc/ =~ "ppabcppabc"   # 2
p /abc/ =~ "pab"          # nil

マッチした場合は文字列のどの位置からマッチしたかを返しています。例えば「ppabc」に対してマッチングをした場合は次のようになります。

ppabc
------
01234

正規表現オブジェクトが表すパターンは「abc」ですので、文字列の「a」の部分からマッチしています。その為、「=~」メソッドの戻り値は「2」となります。

Stringクラスの「=~」メソッド

「=~」メソッドはRegexpクラスのメソッドですので、メソッドの左辺には正規表現オブジェクトを、右辺には対象の文字列を記述します。

ただ「=~」メソッドはStringクラスでも用意されています。

文字列オブジェクト =~ regexp

右辺に記述した正規表現オブジェクトが左辺の文字列オブジェクトにマッチした場合には、マッチした位置のインデックスを返します。結局Regexpクラスで用意されている「=~」メソッドをと同じです。

よって正規表現オブジェクトを使ってマッチしているかどうかを調べるには次のどちらの記述方法でも同じとなります。

/abc/ =~ "abc"
"abc" =~ /abc/

どちらでも同じ結果となりますが、どちらかと言えば正規表現オブジェクトに対してRegexpクラスで用意されている「=~」メソッドを実行する方法のようです。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test4-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  print(Kconv.tosjis(str + " は /abc/ に"))

  reg = Regexp.compile("abc")
  pos = (reg =~ str)
  if pos then
    print(Kconv.tosjis("マッチします¥n"))
    print(Kconv.tosjis("位置は "), pos, Kconv.tosjis(" です¥n"))
  else
    print(Kconv.tosjis("マッチしません¥n"))
  end
end

check("abc")
check("pabc")
check("ppabc")
check("ppabcppabc")
check("pab")

上記のプログラムを「test4-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。

「=~」メソッドによるマッチング

( Written by Tatsuo Ikura )