From: Osame Ken'ichiro Date: 1999-09-21T16:41:19+09:00 Subject: [ruby-dev:7890] regular expression in SJIS はじめまして、納といいます。 "山崎" -> "山!ED95!" のように、SJISの機種依存文字と拡張文字を取り除こうと、 # ↑拡張文字の"崎" buf = buf.gsub(/#{"[\xed\x40-\xfc\x4b\x87\x40-\x87\x9c]"}/s) do |c| one = c[0] two = c[1] sprintf("!%X%X!", one.to_i, two.to_i) end のようなコードを書いたのですが、ver 1.4.1 からおかしな動作をするように なってしまいました。 具体的には、SJISの文字境界にまたがって、マッチしてしまいます。 1.4.0 と 1.4.1 の regex.c を見くらべて、 re_compile_fastmap()の while (beg <= end) { /* NOTE: Charset for multi-byte chars might contain single-byte chars. We must reject them. */ if (beg < 0x100) fastmap[beg] = 2; ← ここ else if (ismbchar(beg)) fastmap[beg] = 1; beg++; } の数字を適当(例えば1)に書換えるとなぜか期待通りに動きました。 御役にたてれば幸いです。 では。 -- Osame Ken'ichiro plonk@munakata.ne.jp , plonk@reo.to , plonk@csnet.ne.jp ICQ#: 21549876