- Home ›
- Ruby正規表現の使い方 ›
- 後方参照 ›
- HERE
マッチした文字列を取得($&)
正規表現オブジェクトを作成し、「=~」メソッドを使って対象の文字列に対してマッチングを行った結果がマッチした場合、「=~」メソッドは文字列の中でマッチした部分のインデックスを返します。この時、対象の文字列の中でマッチした部分文字列が特別な変数「$&」に代入されます。
$&
特別な変数「$&」には正規表現によるマッチが行われるたびにマッチした部分文字列が都度上書きされていきます。なお、正規表現が文字列にマッチしなかった時には変数「$&」には「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")
サンプルプログラム
では簡単なプログラムで確認して見ます。
#! 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 )