如何在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
相关产品推荐
相关产品推荐

