マッチした文字列を取得する($&)

正規表現がマッチした場合、特別な変数「$&」を使ってマッチした文字列を取得することができます。ここでは Ruby の正規表現でマッチした文字列を取得する方法について解説します。

(Last modified: )

マッチした文字列を取得

正規表現オブジェクトを作成し、 =~ メソッドを使って対象の文字列に対してマッチングを行った結果がマッチした場合、 =~ メソッドは文字列の中でマッチした部分のインデックスを返します。この時、対象の文字列の中でマッチした部分文字列が特別な変数 $& に代入されます。

$&

変数 $& には正規表現によるマッチが行われるたびにマッチした部分文字列が都度上書きされていきます。なお、正規表現が文字列にマッチしなかった時には変数 $& には nil が代入されます。

より具体的な例で確認して見ます。

/year/ =~ "10 years old"
print($& + "\n")

上記では正規表現は対象の文字列にマッチしますので、対象文字列の中で正規表現にマッチした部分文字列「year」が変数 $& に代入されます。

/ .+ / =~ "10 years old"
print($& + "\n")

上記では正規表現は対象の文字列にマッチしますので、対象文字列の中で正規表現にマッチした部分文字列「 years 」が変数 $& に代入されます。

/Year/ =~ "10 years old"
p $&

上記では正規表現は対象の文字列にマッチしませんので、変数 $& には nil が代入されます。

Regexp.last_matchを使う

Regexp クラスで用意されているクラスメソッドの last_match を使ってもマッチした文字列を取得できます。

Regexp.last_match([nth])

変数 $& と同じくマッチした部分文字列を取得する場合は、引数に 0 を指定して下さい。

/ .+ / =~ "10 years old"
print(Regexp.last_match(0) + "\n")
サンプルコード

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

# encoding: UTF-8

def check(str)
  if / .+ / =~ str then
    puts("○" + str + "(" + $& + ")")
  else
    puts("×" + str)
  end
end

puts("/ .+ / にマッチするかどうか")

check("10 years old")
check("What would you like to have?")
check("Search results")
check("Hello")

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

マッチした文字列を取得($&)

-- --

Ruby の正規表現でマッチした文字列を取得する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。