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

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

(2021 年 06 月 30 日公開 / 2022 年 10 月 11 日更新)

マッチした文字列を取得

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

$&

変数 $& には正規表現によるマッチが行われるたびにマッチした部分文字列が都度上書きされていきます。なお、正規表現が文字列にマッチしなかった時には変数 $& には 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 )

広告
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。