有没有简单的方法来使用str::matchescase-insensitively

推荐答案

始终可以将两个字符串转换为相同的大小写.这将适用于某些情况:

let needle = "μτς";
let haystack = "ΜΤΣ";

let needle = needle.to_lowercase();
let haystack = haystack.to_lowercase();

for i in haystack.matches(&needle) {
    println!("{:?}", i);
}

请参见str::to_ascii_lowercase了解仅限ASCII的变体.

在其他情况下,regex crate might do enough case-folding(可能是Unicode)适合您:

use regex::RegexBuilder; // 1.4.3

fn main() {
    let needle = "μτς";
    let haystack = "ΜΤΣ";

    let needle = RegexBuilder::new(needle)
        .case_insensitive(true)
        .build()
        .expect("Invalid Regex");

    for i in needle.find_iter(haystack) {
        println!("{:?}", i);
    }
}

然而,请记住,Rust的字符串最终是UTF-8.是的,你需要处理所有的UTF-8.这意味着 Select 大写或小写可能会改变结果.对requires that you know the language of the text字,同样只改大小写;这不是字节的固有属性.是的,你可以有包含表情符号和其他令人兴奋的东西的字符串beyond the Basic Multilingual Plane.

另见:

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

当Option为None时,Option数组是否占用Rust中的内存?

如何在Rust中表示仅具有特定大小的数组

限制未使用的泛型导致编译错误

制作一片连续整数的惯用Rust 方法?

S,一般性状和联想型性状有什么不同?

如何创建一个可变的嵌套迭代器?

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

使用占位符获取用户输入

Option<&T> 如何实现复制

Rust与_有何区别?

为什么带有生命周期指定的方法不能被调用两次?

类型判断模式匹配panic

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

为什么可以从闭包中返回私有 struct

制作嵌套迭代器的迭代器

为什么 std::iter::Peekable::peek 可变地borrow self 参数?