如何在Rust中分割字符串?

How do I split a string in Rust?

从文档中尚不清楚。 在Java中,您可以这样使用split方法:

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


使用split()

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

这提供了一个迭代器,您可以将其循环或collect()插入向量。

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 String有一个特殊的方法split

    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返回Iterator,您可以使用collectsplit_line.collect::>()将其转换为Vec。通过迭代器而不是直接返回Vec具有多个优点:

    • split是懒惰的。这意味着除非您需要,否则它不会真正分割线。这样,如果只需要前几个值:split_line.take(2).collect::>(),或者只需要可以转换为整数的第一个值:split_line.filter_map(|x| x.parse::().ok()).next(),就不会浪费时间分割整个字符串。最后一个示例不会浪费时间尝试处理" 23.0",但是一旦找到" 1",它将立即停止处理。
    • split对要存储结果的方式不做任何假设。您可以使用Vec,但是您也可以使用实现FromIterator<&str>的任何东西,例如LinkedListVecDeque,或者任何实现FromIterator<&str>的自定义类型。


    还有split_whitespace()

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