\wに日本語文字も含まれるが、$KCODEを適切に設定するか、 個別に指定する必要がある。 (\bは\wと\Wを表す幅0の正規表現。)
# euc-jpの環境の場合 /a\b/ === 'あaあ' #=> 2 /\ba/ === 'あaあ' #=> nil /\ba/e === 'あaあ' #=> nil /\ba/e === 'あaあ' #=> nil # Shift_JISの環境の場合 /a\b/ === 'あaあ' #=> 3 /\ba/ === 'あaあ' #=> nil /\ba/s === 'あaあ' #=> nil /\ba/s === 'あaあ' #=> nil
Regexp#eql?とRegexp#hashは定義されていない (Object#eql?とObject#hashが使われる)ので、 Hashのキーには向いていません。
//.eql? // #=> false
ある文字列を含む正規表現を作る場合には Regexp#quoteする必要があります。 *1
a = 'a.c' /^#{a}$/ === 'abc' #=> 0 (マッチした) /^#{Regexp.quote a}$/ === 'abc' #=> nil (マッチしない)
Perlでは正規表現 $ にマッチできる箇所が文字列末尾の "\n" の中に2カ所 ありますが、Rubyでは1カ所しかありません。
# Perl では $ は改行の前と文字列末尾にマッチする % perl -e '$s = "\n"; $s =~ s/$/o/g; print "[$s]\n";' [o o] # Ruby では $ は改行の前にしかマッチしない % ruby -e '$s = "\n"; $s.gsub!(/$/, "o"); print "[#$s]\n"' [o ]
*1セキュリティホールになる可能性もあるので十分注意してください。