从documentation来看,目前尚不清楚。在Java中,您可以使用split
方法,如下所示:
"some string 123 ffd".split("123");
答案 0 :(得分:96)
使用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();
答案 1 :(得分:23)
有三种简单的方法:
通过分隔符:
s.split("separator")
通过空白:
s.split_whitespace()
通过换行符:
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());
答案 2 :(得分:21)
有一种特殊方法split
for struct String
:
fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>
按字母分割:
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"]);
答案 3 :(得分:6)
split
会返回Iterator
,您可以使用collect
转换为Vec
:split_line.collect::<Vec<_>>()
。通过迭代器而不是直接返回Vec
有几个好处:
split
很懒。这意味着它不会真正分裂线,直到您需要它为止。这样,如果您只需要前几个值,它就不会浪费时间分割整个字符串:split_line.take(2).collect::<Vec<_>>()
,或者即使您只需要第一个可以转换为整数的值:{{1} }。最后一个例子不会浪费时间来尝试处理&#34; 23.0&#34;但一旦找到&#34; 1&#34;。split_line.filter_map(|x| x.parse::<i32>().ok()).next()
不会假设您想要存储结果的方式。您可以使用Vec
,但也可以使用实现FromIterator<&str>
的任何内容,例如LinkedList
或VecDeque
,或任何实现split
的自定义类型}。答案 4 :(得分:4)
fn main() {
let words: Vec<&str> = " foo bar\t\nbaz ".split_whitespace().collect();
println!("{:?}", words);
// ["foo", "bar", "baz"]
}