Rust 中的分割字符串,将连续的分隔符视为一个

Gau*_*don 1 rust

如何在 Rust 中拆分字符串,以便将连续的分隔符合并为一个?例如:

"1  2 3".splitX(" ")
Run Code Online (Sandbox Code Playgroud)

应该产生这个Vec:(["1", "2", "3"]当从 Split 对象或任何其他可能存在的中间对象收集时)。这个例子是针对空白的,但我们也应该能够将其扩展到其他分隔符。

我相信我们可以.filter()在使用后删除空项目.split(),但如果它可以.split()直接作为原始项目的一部分来完成,那就更干净了。我显然对此进行了彻底的搜索,并且很惊讶我在任何地方都找不到答案。

我知道对于空白我们已经有split_whitespace()and split_ascii_whitespace(),但我正在寻找适用于通用分隔符字符串的解决方案。

Den*_*ret 6

标准解决方案是split使用filter

let output: Vec<&str> = input
    .split(pattern)
    .filter(|s| !s.is_empty())
    .collect();
Run Code Online (Sandbox Code Playgroud)

这是快速且清晰的。

您还可以使用正则表达式来避免过滤步骤:

let output: Vec<&str> = regex::Regex::new(" +").unwrap()
    .split(input)
    .collect();
Run Code Online (Sandbox Code Playgroud)

如果它在一个将被多次调用的函数中,您可以使用lazy_regex避免重复Regex编译:

let output: Vec<&str> = lazy_regex::regex!(" +")
    .split(input)
    .collect();
Run Code Online (Sandbox Code Playgroud)