文字クラス内でのメタ文字について

パターン内で記述すると特別な意味を持つメタ文字ですが、文字クラスの中では一部を除いて単なる文字として扱われます。ここでは Ruby の正規表現で文字クラス内でのメタ文字の扱いについて解説します。

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

文字クラス内でのメタ文字について

文字クラス内ではメタ文字は特別な意味を持つものと持たないものがあります。順番に確認していきます。

ハイフン(-)

ブランケット([])内でハイフン(-)は範囲を表すメタ文字として扱われます。

/[0-9]/

ハイフン(-)を1つの文字として扱いたい場合には \ を使ってエスケープします。

/[0\-9]/

上記では「0」「-」「9」のいずれかの文字にマッチします。

またブランケット[]内で先頭か最後にハイフン(-)を記述した場合、範囲を表すことが出来ませんのでこの場合はエスケープ無しでも単なる文字として扱われます。

/[-09]/
/[09-]/

上記の場合も「0」「-」「9」のいずれかの文字にマッチします。

なおハイフン(-)は文字クラスの外では特別な意味を持ちませんので単なる文字として扱われます。

/0-9/

上記の場合は「0-9」と言う文字列だけにマッチします。

キャレット(^)

ブランケット([])内でキャレット(^)は否定を表すメタ文字として扱われます。

/[^0-9]/

※ 文字クラスの否定について詳しくは「文字クラスで列挙した文字以外とマッチする」を参照されてください。

キャレット(^)は先頭以外で使われた場合には特別な意味を持ちませんので 1 つの文字として扱われます。

/[012^]/

上記では「0」「1」「2」「^」のいずれかの文字にマッチします。

. * + ? { } |

文字クラス以外で使用される下記のメタ文字は文字クラス内では特別な意味を持ちませんので単なる文字として扱われます。

/[.*+?(){}|]/

上記では「.」「*」「+」「?」「(」「)」「{」「}」「|」のいずれかの文字にマッチします。

[と]

ブランケット[]内で [] を使用する場合は \ を使ってエスケープする必要があります。

/[ab\[cd\]ef]/

上記では「a」「b」「[」「c」「d」「]」「e」「f」のいずれかの文字にマッチします。

※「[」はRuby1.8以降だとエスケープしない場合に警告が表示されます。

「\」

エスケープ処理を行うための \ はブランケット[]内でも特別な意味を持ちますので、 \ を 1 つの文字として扱う場合には \ を使ってエスケープする必要があります。

/[\\$]/

上記では「\」「$」のいずれかの文字にマッチします。

サンプルコード

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

# encoding: UTF-8

def check(str)
  if /200[.*+?(){}|^\-\[\]\\]/ =~ str then
    puts("○" + str)
  else
    puts("×" + str)
  end
end

puts("200[.*+?(){}|^\-\[\]\\] にマッチするかどうか")

check("200.")
check("200*")
check("200+")
check("200?")
check("200[")
check("200{")
check("200}")
check("200(")
check("200)")
check("200|")
check("200-")
check("200]")
check("200\\")

下記のように実行して下さい。

文字クラス内でのメタ文字

-- --

Ruby の正規表現で文字クラス内でのメタ文字の扱いについて解説しました。

( Written by Tatsuo Ikura )

広告
Profile
profile_img

著者 / TATSUO IKURA

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