- Home ›
- Ruby入門 ›
- Ruby正規表現の使い方
マッチした文字列の前後の文字列を取得する($`、$')
正規表現がマッチした時に、変数「$&」にはマッチした部分文字列が代入されますが、変数「$`」と変数「$'」を使ってマッチした前後の文字列も取得することができます。ここでは Ruby の正規表現でマッチした文字列の前後の文字列を取得する方法について解説します。
(Last modified: )
マッチした文字列の前後の文字列を取得
正規表現がマッチした時に、変数 $&
にはマッチした部分文字列が代入されますが、対象の文字列の中でマッチした部分よりも前の文字列が特別な変数 $`
に代入され、後の文字列が特別な変数 $'
に代入されます。
$` $'
具体的に考えてみます。正規表現オブジェクト /On/
に対して文字列「RubyOnRails」をマッチさせた場合、マッチに成功します。この時、変数 $&
にはマッチした部分文字列「On」が代入されますが、同時に変数 $`
には「On」より前の「Ruby」が代入され、変数 $'
には「On」より後の「Rails」が代入されます。
/On/ =~ "RubyOnRails" $` => "Ruby" $& => "On" $' => "Rails"
なお、マッチした部分の前後に文字列が存在しなかった場合は空文字が代入されます。
/OnRails/ =~ "RubyOnRails" $` => "Ruby" $& => "OnRails" $' => ""
またマッチしなかった場合には変数 $`
及び変数 $'
はいずれも nil
が代入されます。
/Off/ =~ "RubyOnRails" $` => nil $& => nil $' => nil
Regexp.last_match.pre_match及びRegexp.last_match.post_matchを使う
Regexp
ラスで用意されているクラスメソッドの last_match
を引数無しで実行すると MatchData
クラスのオブジェクトを取得できます。
Regexp.last_match
MatchData
クラスのオブジェクトは正規表現が最後にマッチした時の情報を保持しているオブジェクトです。 MatchData
クラスで用意されている pre_match
メソッド及び post_match
メソッドによってマッチした部分文字列の前後の文字列を取得できます。
Regexp.last_match.pre_match Regexp.last_match.post_match
Regexp.last_match.pre_match
メソッドが返す値は変数 $`
に代入されている文字列と同じです。同じく Regexp.last_match.post_match
メソッドが返す値は変数 $'
に代入されている文字列と同じです。
/On/ =~ "RubyOnRails" print(Regexp.last_match.pre_match + "\n") print(Regexp.last_match(0) + "\n") print(Regexp.last_match.post_match + "\n")
上記ではそれぞれ「Ruby」「On」「Rails」が出力されます。
では簡単なプログラムで確認してみます。
# encoding: UTF-8 def check(str) if / .+ / =~ str then puts("○" + str) puts(" [" + $` + "]") puts(" [" + $& + "]") puts(" [" + $' + "]") 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 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。