Techioz Blog

Ruby の String#gsub、unicode、および非単語文字

概要

より大きな一連の操作の一環として、より大きな文字列のトークン化されたチャンクを取得し、句読点や非単語のゴブルディグックなどを取り除こうとしています。最初の試みでは、次のような String#gsub と 正規表現文字クラスを使用しました。それで:

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

超、超、超シンプル。もちろん、今は非ラテン文字を処理できるようにプログラムを拡張していますが、まったく問題がありません。 Ruby の は [^A-Za-z0-9_] のようなもののようですが、当然、発音記号 (ü、í など) を含むものは除外されます。そのため、以前は単純だったコードがクラッシュし、不快な方法で燃えてしまいます。

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

gsub() がアクセント付きの「í」文字を強制的に削除していることに注意してください。これを修正するために私が考えた方法の 1 つは、Ruby の ホワイトリストを拡張して上位の Unicode コード ポイントを含めることです。しかし、コード ポイントが非常に多く、いくつかを見逃して、将来的に問題が発生することはわかっています (そして非ラテン語については考えないでおこう…)。もう 1 つの解決策は、削除したいもの (句読点、$/%/&/™ など) をすべてブラックリストに登録することです。しかし、繰り返しになりますが、それらは非常に多く、本当にプレイを開始したくありません。ブラックリストのもぐらたたき。

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

解決策

UTF-8 を使用するには、「-Ku」オプションを付けて Ruby を実行する必要があります。コマンドライン オプションについてはドキュメントを参照してください。 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> 

#に付けることもできます! Ruby スクリプト内の次の行:

#!/usr/bin/ruby -Ku