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");
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();
Il y a trois manières simples:
Par séparateur:
s.split("separator")
Par espace:
s.split_whitespace()
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());
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"]);
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>
_.Il y a aussi split_whitespace()
fn main() {
let words: Vec<&str> = " foo bar\t\nbaz ".split_whitespace().collect();
println!("{:?}", words);
// ["foo", "bar", "baz"]
}