マッチした文字列の前後の文字列を取得する($`、$')

正規表現がマッチした時に、変数「$&」にはマッチした部分文字列が代入されますが、変数「$`」と変数「$'」を使ってマッチした前後の文字列も取得することができます。ここでは 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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。