ps4 - rust traduccion
¿Cómo puedo dividir una cadena en Rust? (5)
De la documentation , no está claro. En Java, puedes usar el método de split así:
"some string 123 ffd".split("123");
Hay tres formas simples:
Por separador :
s.split("separator")Por espacio en blanco :
s.split_whitespace()Por nuevas líneas
s.lines()
El resultado de cada clase es un iterador:
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());
Hay un método especial split para struct String :
fn split<''a, P>(&''a self, pat: P) -> Split<''a, P> where P: Pattern<''a>
Dividir por char:
let v: Vec<&str> = "Mary had a little lamb".split('' '').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
Dividir por cadena:
let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);
Split por cierre:
let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);
También hay split_whitespace()
fn main() {
let words: Vec<&str> = " foo bar/t/nbaz ".split_whitespace().collect();
println!("{:?}", words);
// ["foo", "bar", "baz"]
}
Usa split()
let mut split = "some string 123 ffd".split("123");
Esto le da un iterador, que puede recorrer, o collect() en un vector.
for s in split {
println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();
split devuelve un Iterator , que puede convertir en un Vec utilizando collect : split_line.collect::<Vec<_>>() . Pasar por un iterador en lugar de devolver un Vec directamente tiene varias ventajas:
-
splites floja. Esto significa que realmente no dividirá la línea hasta que la necesite. De esta manera, no perderá tiempo dividiendo toda la cadena si solo necesita los primeros valores:split_line.take(2).collect::<Vec<_>>(), o incluso si solo necesita el primer valor que se puede convertir a un número entero:split_line.filter_map(|x| x.parse::<i32>().ok()).next(). Este último ejemplo no perderá tiempo intentando procesar el "23.0" pero dejará de procesarse inmediatamente una vez que encuentre el "1". -
splitno presupone la forma en que desea almacenar el resultado. Puede usar unVec, pero también puede usar cualquier cosa que implementeFromIterator<&str>, por ejemplo, unaLinkedListo unVecDeque, o cualquier tipo personalizado que implementeFromIterator<&str>.