如何在Rust中拆分字符串?

アレッ*_*ックス 103 rust

文档来看,目前尚不清楚.在Java中,您可以使用如下split方法:

"some string 123 ffd".split("123");
Run Code Online (Sandbox Code Playgroud)

Man*_*rth 120

使用 split()

let mut split = "some string 123 ffd".split("123");
Run Code Online (Sandbox Code Playgroud)

这给出了一个迭代器,您可以将其循环或collect()转换为向量.

for s in split {
    println!("{}", s)
}
let vec = split.collect::<Vec<&str>>();
// OR
let vec: Vec<&str> = split.collect();
Run Code Online (Sandbox Code Playgroud)

  • 你也可以把它写成`.collect :: <Vec <_ >>()`. (12认同)
  • @AlexanderSupertramp使用`.count()`.`len()`仅适用于知道其确切大小而不需要消耗的迭代器,`count()`使用迭代器. (4认同)
  • 如何获得结果的长度 - `let split`?`split.len()` 不存在。 (2认同)
  • @AlexanderSupertramp `让 mut split`,抱歉。 (2认同)

Den*_*din 35

有三种简单的方法:

  1. 分隔符:

    s.split("separator")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过空格:

    s.split_whitespace()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 换行符:

    s.lines()
    
    Run Code Online (Sandbox Code Playgroud)

每种结果都是一个迭代器:

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());
Run Code Online (Sandbox Code Playgroud)


Den*_*hin 25

splitstructString有一种特殊的方法:

fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where P: Pattern<'a>
Run Code Online (Sandbox Code Playgroud)

按字母分割:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
Run Code Online (Sandbox Code Playgroud)

按字符串拆分:

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);
Run Code Online (Sandbox Code Playgroud)

按关闭拆分:

let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
assert_eq!(v, ["abc", "def", "ghi"]);
Run Code Online (Sandbox Code Playgroud)


jay*_*elm 9

还有 split_whitespace()

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


Pio*_*ski 8

如果您正在寻找 Python 风格的拆分,其中您对拆分字符串的两端进行元组解包,您可以这样做

if let Some((a, b)) = line.split_once(' ') {
    // ...
}
Run Code Online (Sandbox Code Playgroud)


Jmb*_*Jmb 7

split返回一个Iterator,您可以将其转换为Vec使用collect:split_line.collect::<Vec<_>>().通过迭代器而不是Vec直接返回a 有几个优点:

  • split很懒.这意味着在您需要之前它不会真正拆分线.这样,如果你只需要前几个值split_line.take(2).collect::<Vec<_>>(),它就不会浪费时间分割整个字符串:或者,即使你只需要第一个可以转换为整数的值:split_line.filter_map(|x| x.parse::<i32>().ok()).next().最后一个例子不会浪费时间尝试处理"23.0",但会在找到"1"后立即停止处理.
  • split没有假设你想要存储结果的方式.您可以使用a Vec,但也可以使用实现的任何内容,FromIterator<&str>例如a LinkedList或a VecDeque,或任何实现的自定义类型FromIterator<&str>.

  • 感谢您的详细回答,任何想法为什么 `let x = line.unwrap().split(",").collect::&lt;Vec&lt;_&gt;&gt;();` 不起作用,除非它被分成两个单独的行: `let x = line.unwrap();` 和 `let x = x.split(",").collect::&lt;Vec&lt;_&gt;&gt;();`?错误消息显示:“此处创建的临时值 ^ 仍借用时在此处丢弃的临时值” (2认同)