2009-10-26 21 views
12

大規模な一連の操作の一環として、私は大きな文字列のトークン化されたチャンクを取り、句読点、非単語のゴブリンジクなどを取り除こうとしています。最初の試みはString#gsubを使用して\W正規表現の文字クラス、そのような:Rubyの文字列#gsub、unicode、および単語以外の文字

my_str = "Hello," 
processed = my_str.gsub(/\W/,'') 
puts processed # => Hello 

スーパー、スーパー、スーパーシンプル。もちろん、私はラテン文字以外の文字を扱うプログラムを拡張しています。 Rubyの\Wは、[^A-Za-z0-9_]のようなものですが、もちろん発音区別記号(Ü、íなど)は除きます。だから、今unpleasentの方法で、私の以前は、単純なコードがクラッシュし、やけど:GSUB

my_str = "Quística." 
processed = my_str.gsub(/\W/,'') 
puts processed # => Qustica 

お知らせ()親切アクセント「I」の文字を削除しました。私がこれを修正するために考えた1つの方法は、より高いUnicodeコードポイントを含むようにRubyの\ Wホワイトリストを拡張することですが、非常にたくさんあるので、いくつか見逃して問題を引き起こしますラテン語以外の言語についても考え始めてみましょう...)。もう一つの解決策は、私が捨てたい(句読点、$ /%/ & /™など)すべてのものをブラックリストに載せることですが、もう一度、それがひどいです。本当にブラックリストを再生し始める。

誰かがこの問題の原則的な解決策を見つけましたか?私がまだ発見していないの隠された、Unicodeに優しいバージョンがありますか?ありがとう!

答えて

12

UTF-8を使用するには、「-Ku」オプションを指定してrubyを実行する必要があります。 command-line optionsのドキュメントを参照してください。これはirbでこれを行うとどうなりますか:

% irb -Ku 
irb(main):001:0> my_str = "Quística." 
=> "Quística." 
irb(main):002:0> processed = my_str.gsub(/\W/,'') 
=> "Quística" 
irb(main):003:0> 

また、#!あなたのルビースクリプトの行:

#!/usr/bin/ruby -Ku 
+0

Gah。私はすでにUTF-8モードであると思った。それは物事を並べ替え、助けてくれてありがとう! –

4

私はそれをデフォルトで1.9.1に追加したいと思います。

$ irb 
ruby-1.9.1-p243 > my_str = "Quística." 
=> "Quística." 
ruby-1.9.1-p243 > processed = my_str.gsub(/\W/,'') 
=> "Quística" 
ruby-1.9.1-p243 > processed.encoding 
=> #<Encoding:UTF-8> 

PS。さまざまなバージョンのRubyを試してみると、rvmに勝るものはありません。 DS。

+0

うん、それは確かに見てうれしい。私はまだ1.9で遊んでいませんでしたが、1.8の文字エンコーディングのいくつかに対応していることがうれしいです。 –

+0

それだけではなく、それらのすべてに対処しています。そして、Java、C++、Python、PHP、などのすべて。 Ruby 1.9のエンコーディングシステムはおそらく最も強力で、最も完全なエバールですが、例外的にELispのみが例外です。それはまた、見た目には見事に複雑に見えますが、それはエンコーディング*が複雑なためです。 Javaのエンコーディングはもっとシンプルに見えるかもしれませんが、実際には* Stringを使用しているJavaの適度に複雑な部分を見たことがありますか?いいえ、すべてのパーサー、デコーダ、コンパイラ、Regexpエンジン、XMLライブラリは実際には 'byte []'を使用します。なぜなら* 'String'はあまりに単純すぎるからです。 –

+3

まあ、私は間もなくそれをチェックしなければならないでしょう。残りの人生でもう一度別のキャラクターエンコーディングの問題に対処することが決してなかったために腎臓と交換できるなら、私は実際にこの契約を検討するかもしれないと私は誓っています。私は、本当に大きく、複雑な符号化の問題をすべて忘れてしまいます。元の質問で説明したような愚かな小さなものを考えると、私たちの人生の何時間もの浪費は無駄でしょうか?私はあなたに言うだろう:方法。あまりにも。たくさんの。 –

関連する問題