如何在Rust中拆分字符串?

时间:2014-10-30 01:45:31

标签: rust

documentation来看,目前尚不清楚。在Java中,您可以使用split方法,如下所示:

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

5 个答案:

答案 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)

有三种简单的方法:

  1. 通过分隔符

    s.split("separator")
    
  2. 通过空白

    s.split_whitespace()
    
  3. 通过换行符

    s.lines()
    
  4. 每种结果都是迭代器:

    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转换为Vecsplit_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>的任何内容,例如LinkedListVecDeque,或任何实现split的自定义类型}。

答案 4 :(得分:4)

还有split_whitespace()

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