You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中按未知数量的制表符、空格和换行符分割字符串?

在Rust中实现类似Go strings.Fields 的功能

当然可行!Rust 里其实有专门的方法来实现和 Go 中 strings.Fields 完全一致的功能,而且用起来非常简单。

核心解决方案:str::split_whitespace

你需要的是 str::split_whitespace 方法——它会把任意数量的空白字符(包括空格、制表符\t、换行符\n、回车符\r等,甚至 Unicode 空白符)当作分隔符,自动忽略开头和结尾的空白,并且提取所有连续的非空白字符序列。

示例1:匹配你的测试输入

针对你给出的第一个测试用例:

let input = "this is a \n special \t\t word";
let fields: Vec<&str> = input.split_whitespace().collect();
println!("{:?}", fields);

运行后会输出:

["this", "is", "a", "special", "word"]

完全符合你的期望。

示例2:修复你之前的错误用法

针对你提到的第二个输入 "a \t\t\t b \t\t\t\t c",用 split_whitespace 替换你原来的写法:

let line = "a \t\t\t b \t\t\t\t c";
for s in line.split_whitespace() {
    println!("{}", s);
}

会依次输出:

a
b
c

完美解决了你之前用 split("\t\t\t") 得到错误结果的问题。

为什么你之前的写法不对?

你之前用 split("\t\t\t") 得到不符合预期的结果,是因为这个方法是按指定的固定字符串来分割的——它只会在遇到连续三个制表符的位置分割,而不是把任意空白符当作分隔符,所以中间的单个空格、剩余的制表符都会被保留在分割后的字符串里,这显然不是你想要的行为。

自定义空白符集合(可选)

如果你需要更精细的控制(比如只处理空格、制表、换行,排除其他空白符),可以用带闭包的 split 配合过滤:

let input = "this is a \n special \t\t word\r\nanother line";
let fields: Vec<&str> = input
    .split(|c: char| c == ' ' || c == '\t' || c == '\n')
    .filter(|s| !s.is_empty()) // 过滤掉分割产生的空字符串
    .collect();
println!("{:?}", fields);

这个写法会只把空格、制表、换行当作分隔符,其他字符(比如回车\r)会被保留在结果中。

内容的提问来源于stack exchange,提问作者Jal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:07:08