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

広告

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

$&

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

サンプルプログラム

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

test1-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  if / .+ / =~ str then
    print(Kconv.tosjis("○") + str + "(" + $& + ")¥n")
  else
    print(Kconv.tosjis("×") + str + "¥n")
  end
end

print(Kconv.tosjis("/ .+ / にマッチするかどうか¥n¥n"))

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

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

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

( Written by Tatsuo Ikura )