2016-10-25 3 views
4

Я пишу простую полнотекстовую библиотеку поиска и нуждаюсь в складывании флага, чтобы проверить, равны ли два слова. Для этого варианта использования существующие методы .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» для соответствия. См. Chapter 3 - Default Caseless Matching в стандарте Unicode, чтобы узнать, как это работает.

Вот пример кода, который соответствует строке регистронезависимо:

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 функцию:

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

безгильзовых не разоблачать соответствующая функция, которая также нормализуется, но вы можете записать ее с помощью ящика 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, Ord и Hash в нечувствительном к делу порядке. Ведущая ветвь (неизданная) поддерживает как сворачивание флагов ASCII (как оптимизацию), так и свертывание кода Unicode (хотя поддерживается только инвариантное сложение флага).

Смежные вопросы