str::find în Rust

Caută prima (find) sau ultima (rfind) apariție și returnează poziția ei în octeți, sau None.

Sintaxă
pub fn find<P: Pattern>(&self, pat: P) -> Option<usize>
pub fn rfind<P: Pattern>(&self, pat: P) -> Option<usize>

Ce face str::find

find returnează Some(poziție) pentru prima apariție a modelului sau None dacă nu există. rfind returnează poziția ultimei apariții. Poziția este în octeți și este mereu o graniță validă, deci o poți folosi direct pentru tăiere: &s[..poz].

Modelul poate fi un text, un char, o listă de caractere sau o funcție: s.find(char::is_numeric) găsește prima cifră. Ca să afli poziția în litere, numără caracterele dinainte: s[..poz].chars().count().

Parametri

Parametru Descriere
pat Ce se caută.

Ce returnează

Option<usize>: poziția în octeți a începutului potrivirii.

Exemple

Exemplul 1: Poziții în octeți și în litere

fn main() {
    let s = "Mâine plecăm la mare";
    let poz = s.find("plecăm").unwrap();
    println!("octet: {poz}, literă: {}", s[..poz].chars().count());
    println!("primul 'a': {:?}, ultimul 'a': {:?}", s.find('a'), s.rfind('a'));
    println!("caută 'munte': {:?}", s.find("munte"));
}

Rezultat

octet: 7, literă: 6
primul 'a': Some(16), ultimul 'a': Some(19)
caută 'munte': None

Exemplul 2: Extragerea numelui fișierului dintr-o cale

fn main() {
    let cale = "/home/ana/poze/vacanta.jpg";
    let start = cale.rfind('/').map(|p| p + 1).unwrap_or(0);
    let nume = &cale[start..];
    let fara_ext = match nume.rfind('.') {
        Some(p) => &nume[..p],
        None => nume,
    };
    println!("{nume} / {fara_ext}");
    println!("prima cifră din 'Sala B12': {:?}", "Sala B12".find(char::is_numeric));
}

Rezultat

vacanta.jpg / vacanta
prima cifră din 'Sala B12': Some(6)

Greșeli frecvente

  • Folosești poziția ca număr de litere (de exemplu pentru chars().nth(poz)). Este în octeți.
  • Scrii s.find("x").unwrap() fără să fii sigur că textul există: panică la None.

Comenzi înrudite

  • str::contains: Verifică dacă textul conține undeva un text, un caracter sau un caracter care respectă o condiție.
  • str::split_once: Taie textul în două la prima apariție a separatorului și returnează perechea, sau None dacă separatorul lipsește.
  • str::matches: Iterator cu toate bucățile din text care se potrivesc cu modelul (fără suprapuneri); util pentru numărare.
  • str::char_indices: Parcurge caracterele împreună cu poziția lor în octeți: perechi (usize, char).