Ruby1.92 正規表現で日本語にマッチ方法
結論からいうと、これで解決しました。
[ぁ-んァ-ヴ一-龠ーア-ン゚゙・ーャュョァ-ォッ]+
ほんと、日本語の扱いは難しい。
「ア」「ア」「ァ」「ァ」これらの"ア"は、全て異なるアです。
さらに当然の事ながら、全角のハイフンと半角のハイフンは異なります。⇒「ー」「ー」
さらに、パピプペポとかザジズゼゾの「゚」「゙」は、夫々独立した文字の扱いを受けます。
また、「バッタ」と「バッタ」の「ツタヤ」と「ツタヤ」それぞれの「ツ」は全て異なる扱いを受けます。
そして、Ruby1.92では、さらに正規表現の比較が厳密です。
例えば、ある文字列がWindows-31Jのエンコーディングを持つ場合、正規表現に/ホニャララ/sを指定して、
正規表現をShift_JISとして、比較しようとしても、「Windows-31J」と「Shift_JIS」を異なる
エンコーディングとして扱う為、エラーになります。
じゃあ、どうするかというと、最終的には以下のようにしました。
line.encode!('UTF-8')
if line =~ /(\w+?)\.DBM\s+([\wぁ-んァ-ヴ一-龠ア-ンーーャュョァ-ォッ゙゚]+)/u
end
lineは「Windows-31J」として、ファイルから読み込まれたものですが
String#encode!メソッドで、破壊的にUTF-8に変換しています。
さらに正規表現では、/ホニャララ/u とすることによって、UTF-8として検査するようにしています。
ただ、これでも恐らく抜けがあるんじゃないかなあ。
日本語をモレなくマッチさせる正規表現として、もっと良い指定方法が
教えて下さいな。