¿Cómo divido una cadena en Rust?
Según la documentación , no está claro. En Java puedes usar el split
método así:
"some string 123 ffd".split("123");
Aceptado
Usarsplit()
let parts = "some string 123 content".split("123");
Esto proporciona un iterador, que puede recorrer o convertir collect()
en un vector. Por ejemplo:
for part in parts {
println!("{}", part)
}
O:
let collection = parts.collect::<Vec<&str>>();
dbg!(collection);
O:
let collection: Vec<&str> = parts.collect();
dbg!(collection);
Hay tres formas sencillas:
Por separador :
s.split("separator") | s.split('/') | s.split(char::is_numeric)
Por espacios en blanco :
s.split_whitespace()
Por nuevas líneas :
s.lines()
Por expresión regular : (usando
regex
caja)Regex::new(r"\s").unwrap().split("one two three")
El resultado de cada tipo 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 structString
:
fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>
Dividido por palabra:
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
Dividido por delimitador:
let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);
Dividido por cierre:
let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);
split
devuelve un Iterator
, que puedes convertir en un Vec
usando collect
: split_line.collect::<Vec<_>>()
. Pasar por un iterador en lugar de devolverlo Vec
directamente tiene varias ventajas:
split
es perezoso. Esto significa que realmente no dividirá la línea hasta que la necesites. De esa 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 procesarlo inmediatamente una vez que encuentre el "1".split
no hace ninguna suposición sobre la forma en que desea almacenar el resultado. Puedes usar aVec
, pero también puedes usar cualquier cosa que implementeFromIterator<&str>
, por ejemplo aLinkedList
o aVecDeque
, o cualquier tipo personalizado que implementeFromIterator<&str>
.