str::split_once în Rust

Taie textul în două la prima apariție a separatorului și returnează perechea, sau None dacă separatorul lipsește.

Sintaxă
pub fn split_once<P: Pattern>(&self, delimiter: P) -> Option<(&str, &str)>

Ce face str::split_once

split_once(sep) caută prima apariție a separatorului și returnează Some((stânga, dreapta)), fără separator. Dacă separatorul nu există, returnează None, ceea ce te obligă să tratezi cazul.

Varianta rsplit_once taie la ultima apariție. Ambele sunt ideale pentru cheie: valoare, nume@domeniu, fișier.extensie, mai ales împreună cu if let sau let ... else.

Parametri

Parametru Descriere
delimiter Separatorul: char, &str, listă de caractere sau closure.

Ce returnează

Option<(&str, &str)>.

Exemple

Exemplul 1: Anteturi de tip cheie: valoare

fn main() {
    let linii = ["Host: dexblog.ro", "Accept-Language: ro-RO", "linie greșită"];
    for linie in linii {
        match linie.split_once(": ") {
            Some((cheie, valoare)) => println!("{cheie} = {valoare}"),
            None => println!("ignorat: {linie:?}"),
        }
    }
}

Rezultat

Host = dexblog.ro
Accept-Language = ro-RO
ignorat: "linie greșită"

Exemplul 2: Adresă de e-mail cu let … else

fn domeniu(email: &str) -> &str {
    let Some((_, dom)) = email.split_once('@') else {
        return "(fără domeniu)";
    };
    dom
}

fn main() {
    println!("{}", domeniu("ana.popescu@exemplu.ro"));
    println!("{}", domeniu("ana.popescu"));
    println!("{:?}", "arhiva.tar.gz".rsplit_once('.'));
}

Rezultat

exemplu.ro
(fără domeniu)
Some(("arhiva.tar", "gz"))

Greșeli frecvente

  • Folosești split(':').collect::<Vec<_>>() și apoi v[1]: dacă separatorul lipsește, indexarea dă panică. split_once returnează None.

Comenzi înrudite

  • str::splitn: Împarte textul în cel mult n bucăți; ultima bucată conține tot restul textului, cu separatori cu tot.
  • str::split: Împarte textul în bucăți la fiecare apariție a unui separator; rsplit dă bucățile de la coadă spre început.
  • str::find: Caută prima (find) sau ultima (rfind) apariție și returnează poziția ei în octeți, sau None.
  • str::strip_prefix: Scoate o singură dată un prefix (sau sufix) și returnează restul ca Some; dacă textul nu începe cu el, None.