【问题标题】:How do I replace specific characters idiomatically in Rust?如何在 Rust 中惯用地替换特定字符?
【发布时间】:2016-01-05 07:11:37
【问题描述】:

所以我有字符串“Hello World!”并想替换“!”和 ”?”这样新的字符串就是“Hello World?”

在 Ruby 中,我们可以使用 gsub 方法轻松地做到这一点:

"Hello World!".gsub("!", "?")

如何在 Rust 中惯用地做到这一点?

【问题讨论】:

    标签: regex rust


    【解决方案1】:

    您可以用str::replace 替换一个字符串中所有出现的字符串:

    let result = str::replace("Hello World!", "!", "?");
    // Equivalently:
    result = "Hello World!".replace("!", "?");
    println!("{}", result); // => "Hello World?"
    

    对于更复杂的情况,可以使用regex::Regex::replace_all from regex:

    use regex::Regex;
    let re = Regex::new(r"[A-Za-z]").unwrap();
    let result = re.replace_all("Hello World!", "x");
    println!("{}", result); // => "xxxxx xxxxx!"
    

    【讨论】:

    • 请注意,您也可以将replace 作为&str 上的方法调用,如下所示:let result = "Hello World!".replace("!", "?");
    • 请注意:在循环中编译相同的正则表达式是一种反模式,因为编译通常很昂贵。请参阅板条箱说明中的详细信息。
    【解决方案2】:

    您也可以使用迭代器和match 表达式:

    let s:String = "Hello, world!".chars()
        .map(|x| match x { 
            '!' => '?', 
            'A'..='Z' => 'X', 
            'a'..='z' => 'x',
            _ => x
        }).collect();
    println!("{}", s);// Xxxxx, xxxxx?
    

    【讨论】:

    • 我喜欢这个,因为它可以泛化为处理替换无法处理的更复杂的情况,同时比正则表达式便宜(诚然可以处理更多的情况)。
    • Rust playground 警告不要再使用“...”范围模式。应该使用 "..=" 代替。
    • 正则表达式很便宜!
    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多