Как разделить строку в ржавчине?


С документация, это не понятно. В Java вы можете использовать split метод вот так:

"some string 123 ffd".split("123");
5 59

5 ответов:

использовать split()

let mut split = "some string 123 ffd".split("123");

это дает итератор, который вы можете перебирать, или collect() в вектор.

for s in split {
    println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();

есть специальный метод split для struct String:

fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>

разделить на char:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);

разделить строку:

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

разделить по закрытию:

let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);

есть три простых способа:

  1. By разделитель:

    s.split("separator")
    
  2. By пробел:

    s.split_whitespace()
    
  3. By строки:

    s.lines()
    

результатом каждого вида является итератор:

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());

split возвращает Iterator, который можно преобразовать в Vec используя collect:split_line.collect::<Vec<_>>(). Проходя через итератор вместо возврата Vec сразу имеет несколько преимуществ:

  • split ленивый. Это означает, что он не будет действительно разделить линию, пока вам это не нужно. Таким образом, он не будет тратить время на разделение всей строки, Если вам нужны только первые несколько значений: split_line.take(2).collect::<Vec<_>>(), или даже если вам нужно только первое значение, можно преобразовать в целое число:split_line.filter_map(|x| x.parse::<i32>().ok()).next(). Этот последний пример не будет тратить время на обработку "23.0", но сразу же прекратит обработку, как только он найдет"1".
  • split не делает предположений о том, как вы хотите сохранить результат. Вы можете использовать Vec, но вы также можете использовать все, что реализует FromIterator<&str>, например a LinkedList или VecDeque, или любой пользовательский тип, который реализует FromIterator<&str>.

там же split_whitespace()

fn main() {
    let words: Vec<&str> = "   foo   bar\t\nbaz   ".split_whitespace().collect();
    println!("{:?}", words);
    // ["foo", "bar", "baz"] 
}