Rust中的不区分大小写字符串匹配

29

如何简单地使用str::matches进行不区分大小写地匹配?


1
使用 fn to_lowercase(&self) -> String 将两个字符串先转换为小写。 - ChickenFeet
如果我想要获取一个字符串出现的次数 — matches(...).count() - Shepmaster
5
如果您只想使用ASCII字符串进行不区分大小写的字符串比较,请使用eq_ignore_ascii_case - Meet Sinojia
2个回答

26

你可以将两个字符串都转换为相同的大小写。这对某些情况有效:

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 的变体。

在其他情况下,正则表达式包可能已经足够忽略大小写(可能是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。这意味着选择大写或小写可能会改变你的结果。同样,更改文本大小写的唯一正确方法需要知道文本的语言;它不是字节的固有属性。是的,你可以有包含表情符号和其他令人兴奋的东西超出基本多语言平面的字符串。

另见:


9
我知道这并不是原意,但像“基本多语言平面之外的其他令人兴奋的事物”这样的陈述真的具有类似Lovecraft的内涵。好像字符串就像古老的神一样,超出了人类的理解能力,深入对它们的真正理解会让你发疯。在 Rust 书籍向我介绍图形簇的概念后...我有点同意! - fostandy
1
问题涉及字符串,因此escape函数可能会有用:RegexBuilder::new(regex::escape(needle)) - diralik

8
如果您正在使用正则表达式包,您可以使模式不区分大小写:
let re = Regex::new("(?i)μτς").unwrap();
let mat = re.find("ΜΤΣ").unwrap();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接