- Home ›
- Ruby正規表現の使い方 ›
- Ruby正規表現における日本語の扱い ›
- HERE
文字コードによるメタ文字(.)のマッチの違い
メタ文字(.)は任意の1文字にマッチしますが、文字コードが「NONE(ASCII)」以外の場合にはメタ文字(.)は全角文字の1文字にマッチするようになります。
/a.b/u
上記のような正規表現オブジェクトを作成した場合、「aob」や「atb」などだけではなく「a山b」や「a本b」などにもマッチするようになります。
逆に文字コードに「NONE(ASCII)」を指定した場合には、全角文字もバイト単位で扱われます。
/a.b/n
上記のような正規表現オブジェクトを作成した場合、「aob」や「atb」にはマッチしますが「a山b」や「a本b」にはマッチしません。(文字列がUTF-8で記述されていた場合は1文字が3バイトなので「a本b」は「/a...b/n」にマッチします)。
このようにマルチバイトを認識できる文字コード(u, s, e)を指定した場合には、メタ文字(.)はアルファベット1文字だけではなく全角文字の1文字にもマッチします。
サンプルプログラム
では簡単なプログラムで確認して見ます。
#! ruby -Ku
require "kconv"
def check1(str)
if /a.b/u =~ str then
print(Kconv.tosjis("○" + str + "¥n"))
else
print(Kconv.tosjis("×" + str + "¥n"))
end
end
def check2(str)
if /a.b/n =~ str then
print(Kconv.tosjis("○" + str + "¥n"))
else
print(Kconv.tosjis("×" + str + "¥n"))
end
end
print(Kconv.tosjis("/a.b/u にマッチするかどうか¥n¥n"))
check1("aob")
check1("a計b")
check1("aおb")
print("¥n")
print(Kconv.tosjis("/a.b/n にマッチするかどうか¥n¥n"))
check2("aob")
check2("a計b")
check2("aおb")
上記のプログラムを「test2-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。
今回は「/u」をあえて記述していますが、もともと「$KCODE」にUTF-8が設定されていますので実際には文字コードの指定は必要ありません。
( Written by Tatsuo Ikura )
RubyLife