我如何分裂一个字符串在Rust?

文档,它不清楚。在Java中,你可以像这样使用split方法:

"some string 123 ffd".split("123");
288862 次浏览

使用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();

有一个特殊的方法__ABC0用于结构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"]);

还有split_whitespace()

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

有三种简单的方法:

  1. separator . < p >:

     s.split("separator")  |  s.split('/')  |  s.split(char::is_numeric)
    
  2. 空格 < p >:

     s.split_whitespace()
    
  3. newlines < p >:

     s.lines()
    
  4. 通过< a href = " https://docs.rs/regex/1.4.2/regex/struct.Regex.html方法。regex分裂noreferrer“rel = > < / >: (使用regex crate)

     Regex::new(r"\s").unwrap().split("one two three")
    

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

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());

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

  • split是懒惰的。这意味着在您需要它之前,它不会真正地分割行。这样,如果只需要前几个值(split_line.take(2).collect::<Vec<_>>()),或者只需要可转换为整数的第一个值(split_line.filter_map(|x| x.parse::<i32>().ok()).next()),就不会浪费时间拆分整个字符串。最后一个例子不会浪费时间试图处理“23.0”,而是在找到“1”后立即停止处理。
  • split不假设你想要存储结果的方式。你可以使用Vec,但你也可以使用任何实现FromIterator<&str>的类型,例如LinkedListVecDeque,或任何实现FromIterator<&str>的自定义类型。
OP的问题是如何使用多字符字符串进行分割,这里有一种方法可以将part1part2的结果作为Strings而不是vector
这里用非ascii字符串"☄☃🤔"来代替"123":

let s = "☄☃🤔";  // also works with non-ASCII characters
let mut part1 = "some string ☄☃🤔 ffd".to_string();
let _t;
let part2;
if let Some(idx) = part1.find(s) {
part2 = part1.split_off(idx + s.len());
_t = part1.split_off(idx);
}
else {
part2 = "".to_string();
}

得到:part1 = "some string "
         __ ABC0 < / p >

如果找到"☄☃🤔" not,则part1包含未动的原始String,并且part2为空。


这是罗塞塔代码中的一个很好的例子 基于字符的变化拆分字符串-关于如何使用split_off来转换一个简短的解决方案:

fn main() {
let mut part1 = "gHHH5YY++///\\".to_string();
if let Some(mut last) = part1.chars().next() {
let mut pos = 0;
while let Some(c) = part1.chars().find(|&c| {if c != last {true} else {pos += c.len_utf8(); false}}) {
let part2 = part1.split_off(pos);
print!("{}, ", part1);
part1 = part2;
last = c;
pos = 0;
}
}
println!("{}", part1);
}

into that

< p > 任务
根据字符的变化(从左到右)将一个(字符)字符串拆分为逗号(加上一个空白)分隔的字符串