web-dev-qa-db-fra.com

Comment diviser une chaîne en Rust?

De la documentation , ce n'est pas clair. Dans Java, vous pouvez utiliser la méthode split comme suit:

"some string 123 ffd".split("123");
94
アレックス

Utilisez split()

let mut split = "some string 123 ffd".split("123");

Cela donne un itérateur, sur lequel vous pouvez faire une boucle, ou collect() dans un vecteur.

for s in split {
    println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();
108
Manishearth

Il y a trois manières simples:

  1. Par séparateur:

    s.split("separator")
    
  2. Par espace:

    s.split_whitespace()
    
  3. Par nouvelles lignes:

    s.lines()
    

Le résultat de chaque type est un itérateur:

let text = "foo\r\nbar\n\nbaz\n";
let mut lines = text.lines();

assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());

assert_eq!(None, lines.next());
29
DenisKolodin

Il existe une méthode spéciale split POUR STRUCT String :

fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>

Découpé par caractère:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);

Split par chaîne:

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

Split par fermeture:

let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);
22

split renvoie un Iterator , que vous pouvez convertir en un Vec en utilisant collect : split_line.collect::<Vec<_>>(). Parcourir un itérateur au lieu de renvoyer un Vec directement présente plusieurs avantages:

  • split est paresseux. Cela signifie que la ligne ne sera pas scindée tant que vous n'en aurez pas besoin. Ainsi, vous ne perdrez pas de temps à diviser la chaîne entière si vous n'avez besoin que des premières valeurs: split_line.take(2).collect::<Vec<_>>(), ou même si vous n'avez besoin que de la première valeur pouvant être convertie en un entier: split_line.filter_map(|x| x.parse::<i32>().ok()).next(). Ce dernier exemple ne perdra pas de temps à essayer de traiter le "23.0" mais cessera immédiatement de le traiter dès qu'il trouvera le "1".
  • split ne fait aucune hypothèse sur la manière dont vous souhaitez stocker le résultat. Vous pouvez utiliser un Vec , mais vous pouvez aussi utiliser tout ce qui implémente FromIterator<&str> , par exemple un LinkedList ou un VecDeque , ou tout type personnalisé qui implémente _FromIterator<&str>_.
6
Jmb

Il y a aussi split_whitespace()

fn main() {
    let words: Vec<&str> = "   foo   bar\t\nbaz   ".split_whitespace().collect();
    println!("{:?}", words);
    // ["foo", "bar", "baz"] 
}
4
jayelm