How do I split a string in Rust?
从文档中尚不清楚。 在Java中,您可以这样使用
1 | "some string 123 ffd".split("123"); |
使用
1 | let mut split ="some string 123 ffd".split("123"); |
这提供了一个迭代器,您可以将其循环或
1 2 3 4 5 6 | for s in split { println!("{}", s) } let vec = split.collect::<Vec<&str>>(); // OR let vec: Vec<&str> = split.collect(); |
有三种简单的方法:
按分隔符:
1 | s.split("separator") |
通过空格:
1 | s.split_whitespace() |
通过换行符:
1 | s.lines() |
每种类型的结果都是一个迭代器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | let text ="foo bar baz "; 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()); |
struct
1 | fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a> |
按字符分割:
1 2 | let v: Vec<&str> ="Mary had a little lamb".split(' ').collect(); assert_eq!(v, ["Mary","had","a","little","lamb"]); |
按字符串分割:
1 2 | let v: Vec<&str> ="lion::tiger::leopard".split("::").collect(); assert_eq!(v, ["lion","tiger","leopard"]); |
按关闭方式拆分:
1 2 | let v: Vec<&str> ="abc1def2ghi".split(|c: char| c.is_numeric()).collect(); assert_eq!(v, ["abc","def","ghi"]); |
-
split 是懒惰的。这意味着除非您需要,否则它不会真正分割线。这样,如果只需要前几个值:split_line.take(2).collect:: ,或者只需要可以转换为整数的第一个值:>() split_line.filter_map(|x| x.parse:: ,就不会浪费时间分割整个字符串。最后一个示例不会浪费时间尝试处理" 23.0",但是一旦找到" 1",它将立即停止处理。().ok()).next() -
split 对要存储结果的方式不做任何假设。您可以使用Vec ,但是您也可以使用实现FromIterator<&str> 的任何东西,例如LinkedList 或VecDeque ,或者任何实现FromIterator<&str> 的自定义类型。
还有
1 2 3 4 5 6 | fn main() { let words: Vec<&str> =" foo bar\t baz ".split_whitespace().collect(); println!("{:?}", words); // ["foo","bar","baz"] } |