私の場合、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に感謝します)
これらのメソッドについては、正確には何が不十分ですか?あなたが解決しようとしている問題を知らずにあなたの質問に答えるのは難しいです。また、charに定義されているメソッドもあります。https://doc.rust-lang.org/std/primitive.char.html#method.to_lowercase – BurntSushi5
@ BurntSushi5質問に文脈を追加しました。 –
あなたの最善の策はおそらくhttps://docs.rs/caseless/0.1.1/caseless/です – BurntSushi5