str::replace în Rust

Returnează un String nou în care aparițiile modelului sunt înlocuite: toate (replace) sau primele count (replacen).

Sintaxă
pub fn replace<P: Pattern>(&self, from: P, to: &str) -> String
pub fn replacen<P: Pattern>(&self, pat: P, to: &str, count: usize) -> String

Ce face str::replace

replace(din, cu) caută toate aparițiile lui din și creează un String nou cu înlocuirile făcute. Textul original rămâne neschimbat. Căutarea face diferența între litere mari și mici.

replacen(din, cu, n) înlocuiește doar primele n apariții. Modelul poate fi un text, un caracter, o listă de caractere sau o funcție, deci s.replace(char::is_numeric, "#") ascunde toate cifrele.

Parametri

Parametru Descriere
from / pat Ce se caută.
to Textul pus în loc (&str; poate fi gol pentru ștergere).
count Doar la replacen: câte apariții se înlocuiesc, de la început.

Ce returnează

Un String nou.

Exemple

Exemplul 1: Înlocuiri și ștergeri

fn main() {
    let s = "Pretul este 10 lei. Pretul nu include TVA.";
    println!("{}", s.replace("Pretul", "Prețul"));
    println!("{}", s.replacen("Pretul", "Prețul", 1));
    println!("{}", "0742-123-456".replace('-', ""));
    println!("{}", "PIN: 4821".replace(char::is_numeric, "*"));
}

Rezultat

Prețul este 10 lei. Prețul nu include TVA.
Prețul este 10 lei. Pretul nu include TVA.
0742123456
PIN: ****

Exemplul 2: Corectarea diacriticelor cu sedilă

Textele vechi folosesc s și t cu sedilă (U+015F, U+0163) în loc de ș și ț cu virgulă (U+0219, U+021B). Le înlocuim, scriind codurile cu \u{...}, pentru că cele două variante arată aproape la fel.

fn corecteaza(text: &str) -> String {
    text.replace('\u{015F}', "ș")
        .replace('\u{0163}', "ț")
        .replace('\u{015E}', "Ș")
        .replace('\u{0162}', "Ț")
}

fn main() {
    let vechi = "Ora\u{015F}ul Bra\u{015F}ov, \u{0162}ara B\u{00E2}rsei";
    let nou = corecteaza(vechi);
    println!("{nou}");
    println!("s-a schimbat ceva: {}", vechi != nou);
}

Rezultat

Orașul Brașov, Țara Bârsei
s-a schimbat ceva: true

Greșeli frecvente

  • Apelezi s.replace(...) fără să folosești rezultatul. Textul original nu se modifică, iar compilatorul avertizează: unused return value of `str::<impl str>::replace` that must be used.
  • Folosești replace pentru a schimba bucata de la o poziție anume. Pentru poziții există replace_range.

Comenzi înrudite

  • String::replace_range: Înlocuiește pe loc bucata dintr-un interval de octeți cu alt text (de orice lungime).
  • str::find: Caută prima (find) sau ultima (rfind) apariție și returnează poziția ei în octeți, sau None.
  • String::retain: Păstrează doar caracterele pentru care funcția dată returnează true; restul sunt șterse pe loc.
  • str::matches: Iterator cu toate bucățile din text care se potrivesc cu modelul (fără suprapuneri); util pentru numărare.