【问题标题】:Case-insensitive string matching in RustRust 中不区分大小写的字符串匹配
【发布时间】:2018-04-28 03:25:21
【问题描述】:

有没有简单的方法来使用str::matches不区分大小写

【问题讨论】:

  • 首先使用fn to_lowercase(&self) -> String将两个字符串转换为小写
  • 如果我想获取字符串的出现次数matches(...).count()
  • 如果您只想对 ASCII 字符串进行不区分大小写的字符串比较,请使用eq_ignore_ascii_case

标签: string rust


【解决方案1】:

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

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

在其他情况下,您可以使用正则表达式箱 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。这意味着选择大写或小写可能会改变您的结果。同样,更改文本大小写的唯一正确方法requires that you know the language of the text;它不是字节的固有属性。是的,您可以拥有包含表情符号和其他令人兴奋的东西的字符串beyond the Basic Multilingual Plane

另见:

【讨论】:

  • 我知道这不是这个意思,但是像“基本多语言平面之外的其他令人兴奋的事情”这样的陈述确实具有某种洛夫克拉夫特式的内涵。就好像弦乐,就像古神一样,超出了人类的理解范围,深入研究对它们的真正理解会让你发疯。在 rust 书向我介绍了字素簇的概念之后……我有点同意!
  • 问题是关于字符串的,所以escape 函数可能有用:RegexBuilder::new(regex::escape(needle))
【解决方案2】:

如果你使用the regex crate,你可以让模式不区分大小写:

let re = Regex::new(r"(?i)μτς").unwrap();
let mat = re.find("ΜΤΣ").unwrap();

【讨论】:

    猜你喜欢
    • 2014-09-07
    • 2017-12-09
    • 2013-05-03
    • 2014-10-26
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2020-05-15
    • 2016-07-23
    相关资源
    最近更新 更多