Ruby


マルチバイト文字の抽出

今回はShift-jisテキストからマルチバイト文字列を取り出すという処理を行います。 何に使うのかということは置いておいて、ひとまずコードを示しましょう。

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024

#! ruby -Ks # Shirao # sjis文書からマルチバイト文字を取り出す def sjiscutter(file) sjis=/((?:[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc])+)/n open(file, "r"){|io| outline="" while line=io.gets #マルチバイトがないなら空白入れて次へ if(!(sjis=~line)) outline+=line.chomp+" "; next end #マルチバイト文字の前後に[ ]を挿入 line.chomp.split.each{|el| outline+=el.gsub(sjis, "["+"\\1"+"]")} outline+=" " #次の列と区切る end outline.split.each{|el| print el+" "} puts "" } end #Main sjiscutter(ARGV[0]) #ARGV[0] : ターゲットファイル名

ポイント

正規表現

Shift-jisにおいて、マルチバイト文字とマッチする正規表現は /((?:[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]))/nです。今回は文字列に マッチさせるということで+がコード例では付いています。

gsub

今回はマルチバイト文字を[]で囲むという処理をするために
el.gsub(sjis , "["+"\\1"+"]")
このようなコードを書きました。ここで、\\1はマッチした文字列を示しています。

付録

用途

やりたいことがあるからコードは作られるのです。当然これにも目的があります。 たしか、これはコーパスの前処理に使ったものの一部を改変したものです。 たとえば、日本語と英語が交じっている中から日本語文書を取り出して形態素解析するとかに使えます。

ソースコード

Rubyソースコードを置いておきます。


プログラムに戻る