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:
-
split
es 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". -
split
no presupone la forma en que desea almacenar el resultado. Puede usar unVec
, pero también puede usar cualquier cosa que implementeFromIterator<&str>
, por ejemplo, unaLinkedList
o unVecDeque
, o cualquier tipo personalizado que implementeFromIterator<&str>
.