Как разделить строку в ржавчине?
С документация, это не понятно. В Java вы можете использовать split
метод вот так:
"some string 123 ffd".split("123");
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
для structString
: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"]);
есть три простых способа:
By разделитель:
s.split("separator")
By пробел:
s.split_whitespace()
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>
, например aLinkedList
илиVecDeque
, или любой пользовательский тип, который реализуетFromIterator<&str>
.
там же
split_whitespace()
fn main() { let words: Vec<&str> = " foo bar\t\nbaz ".split_whitespace().collect(); println!("{:?}", words); // ["foo", "bar", "baz"] }