¿Cómo divido una cadena en Rust?

Resuelto Incerteza asked hace 10 años • 7 respuestas

Según la documentación , no está claro. En Java puedes usar el splitmétodo así:

"some string 123 ffd".split("123");
Incerteza avatar Oct 30 '14 08:10 Incerteza
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);
Manishearth avatar Oct 30 '2014 02:10 Manishearth

Hay tres formas sencillas:

  1. Por separador :

     s.split("separator")  |  s.split('/')  |  s.split(char::is_numeric)
    
  2. Por espacios en blanco :

     s.split_whitespace()
    
  3. Por nuevas líneas :

     s.lines()
    
  4. Por expresión regular : (usando regexcaja)

     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());
DenisKolodin avatar Jul 01 '2016 06:07 DenisKolodin

Hay un método especial splitpara 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"]);
Denis Kreshikhin avatar May 06 '2015 19:05 Denis Kreshikhin

splitdevuelve un Iterator, que puedes convertir en un Vecusando collect: split_line.collect::<Vec<_>>(). Pasar por un iterador en lugar de devolverlo Vecdirectamente tiene varias ventajas:

  • splites 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".
  • splitno hace ninguna suposición sobre la forma en que desea almacenar el resultado. Puedes usar a Vec, pero también puedes usar cualquier cosa que implemente FromIterator<&str>, por ejemplo a LinkedListo a VecDeque, o cualquier tipo personalizado que implemente FromIterator<&str>.
Jmb avatar Nov 07 '2017 07:11 Jmb