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

広告

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

ハイフン(-)

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

/[0-9]/

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

/[0¥-9]/

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

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

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

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

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

/0-9/

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

キャレット(^)

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

/[^0-9]/

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

/[012^]/

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

なおキャレット(^)は文字クラスの外で使用した場合、行の先頭にマッチするメタ文字となります。

/^012/

上記では「012」と言う文字列が行の先頭にある場合にマッチします。

「.」「*」「+」「?」「{」「}」「|」

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

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

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

「[」「]」

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

/[ab¥[cd¥]ef]/

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

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

「¥」

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

/[¥¥$]/

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

サンプルプログラム

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

test4-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  if /200[.*+?(){}|^¥-¥[¥]¥¥]/ =~ str then
    print(Kconv.tosjis("○") + str + "¥n")
  else
    print(Kconv.tosjis("×") + str + "¥n")
  end
end

print(Kconv.tosjis("200[.*+?(){}|^¥-¥[¥]¥¥] にマッチするかどうか¥n¥n"))

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¥¥")

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

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

( Written by Tatsuo Ikura )