Как я могу заменить отдельные символы в Rust?

Итак, у меня есть строка "Hello World!" и хотите заменить "!" с "?" так что новая строка "Hello World?"

В Ruby мы можем сделать это легко с помощью метода gsub:

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

Как это сделать идиоматично в Rust?

Ответ 1

Вы можете заменить все вхождения одной строки в другой на std::str::replace:

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

В более сложных случаях вы можете использовать regex::Regex::replace_all из 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!"

Ответ 2

Также вы можете использовать итераторы и выражение match:

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

Ответ 3

Я создал эту функцию, чтобы изменить существующую String. Он заменяет все вхождения. Он работает как для char так и для строк.

fn replace_existing(target: &mut String, old: &str, new: &str) {
    loop {
        match target.find(old) {
            Some(i) => {
                target.replace_range(i..i + old.len(), new);
            }
            None => break,
        }
    }
}