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

広告

正規表現オブジェクトはパターンを定義するためのものです。正規表現オブジェクトが対象の文字列にマッチしているかどうかを調べるために、 Regexp クラスでは =~ メソッドが用意されています。ここでは Ruby で Regexp クラスの =~ メソッドを使ってマッチングを行う方法について解説します。

(Last modified: )

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

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 クラスで用意されている =~ メソッドを実行します。

サンプルコード

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

# encoding: UTF-8

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

  reg = Regexp.compile("abc")
  pos = (reg =~ str)
  if pos then
    puts("マッチします")
    puts("位置は " + pos.to_s + " です")
  else
    puts("マッチしません")
  end
end

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

下記のように実行して下さい。

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

-- --

Ruby で Regexp クラスの =~ メソッドを使ってマッチングを行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。