2016-10-25 9 views
4

私は単純な全文検索ライブラリを作成しており、2つの単語が等しいかどうかを確認するために大文字と小文字を区別する必要があります。この使用例では、既存の.to_lowercase()および.to_uppercase()メソッドはnot enoughです。Rustで文字列を折り畳むにはどうしたらいいですか?

crates.ioのクイック検索から、正規化と単語分割はできますが、大文字と小文字の区別はできません。 regex-syntaxにはcase folding codeが含まれていますが、そのAPIでは公開されていません。

任意の既存のソリューションが存在しない場合、私は自分の

+0

これらのメソッドについては、正確には何が不十分ですか?あなたが解決しようとしている問題を知らずにあなたの質問に答えるのは難しいです。また、charに定義されているメソッドもあります。https://doc.rust-lang.org/std/primitive.char.html#method.to_lowercase – BurntSushi5

+0

@ BurntSushi5質問に文脈を追加しました。 –

+1

あなたの最善の策はおそらくhttps://docs.rs/caseless/0.1.1/caseless/です – BurntSushi5

答えて

1

私の場合、caselessクレートが最も有用であることがわかりました。

私が知る限り、これは正規化をサポートする唯一のライブラリです。これは、たとえばあなたが欲しいときに重要です。 "㎒"(U + 3392 SQUARE MHZ)と "mhz"を一致させてください。これの仕組みの詳細については、Unicode StandardのChapter 3 - Default Caseless Matchingを参照してください。

let s = "Twilight Sparkle ちゃん"; 
assert_eq!(caseless::default_case_fold_str(s), "twilight sparkle ちゃん"); 

ケース無しが公開されていない:

extern crate caseless; 
use caseless::Caseless; 

let a = "100 ㎒"; 
let b = "100 mhz"; 

// These strings don't match with just case folding, 
// but do match after compatibility (NFKD) normalization 
assert!(!caseless::default_caseless_match_str(a, b)); 
assert!(caseless::compatibility_caseless_match_str(a, b)); 

直接ケースに折り畳まれ、文字列を取得するには、あなたがdefault_case_fold_str機能を使用することができます。ここでは

は大文字と小文字を区別せずに文字列と一致するいくつかのサンプルコードです対応する関数も同様に正規化しますが、 unicode-normalizationクレートを使用して書き込むことができます:

extern crate unicode_normalization; 
use caseless::Caseless; 
use unicode_normalization::UnicodeNormalization; 

fn compatibility_case_fold(s: &str) -> String { 
    s.nfd().default_case_fold().nfkd().default_case_fold().nfkd().collect() 
} 

let a = "100 ㎒"; 
assert_eq!(compatibility_case_fold(a), "100 mhz"); 

正しい結果を得るには、複数回の正規化と大文字小文字の折り返しが必要であることに注意してください。

(このライブラリを私に指摘してくれたBurntSushi5に感謝します)

2

unicaseクレートが直接折りたたみケースを公開していませんが、それはEqを実装して、一般的なラッパー型を提供し、OrdHashロールバックする必要がある場合があります大文字と小文字は区別されません。マスターブランチ(未リリース)は、ASCIIケースの折りたたみ(最適化として)とUnicodeのケースフォールディング(不変のケースフォールディングのみがサポートされています)の両方をサポートします。

関連する問題