我正在尝试拆分 crontab 条目,其中一个要求是最后一个字段,即命令,应保留原始空格。换句话说,给定这条线
1 2 3 4 5 command "much whitespace"
结果结构应包含六个元素,最后一个元素正是字符串
command "much whitespace"
。所以我需要做
entry.splitn(6, [something involving whitespace])
或 entry.split_whitespace([something involving 6])
。前者看起来更干净,但我似乎无法重用任何实现:entry.splitn(6, str::split_whitespace)
是类型不匹配 entry.splitn(6, entry.split_whitespace())
导致“特征 std::ops::FnMut<(char,)>
未为 std::str::SplitWhitespace<'_>
实现” split_whitespace
的实现,因为 std::std_unicode::str::UnicodeStr
是私有(private)的。 有没有一种简洁的方法来组合这些?
最佳答案
entry.splitn(6, char::is_whitespace)
对于示例字符串应该可以正常工作。也就是说,如果字段由正好一个空白字符分隔。如果您确定 crontab 条目就是这种情况,那么这种方法就足够了。但是,正如@DK. 的回答中指出的那样,如果字段之间碰巧有额外的空格,则每个字段都会导致拆分。
例如,
"1 2 3 4 5 command \"much whitespace\""
结果为 "1", "2", "", "", "3", "4 5 command \"much whitespace\""
。最干净的解决方案可能是手动解析字符串。但是作为一种快速而肮脏的解决方案,可以使用带有状态闭包的
splitn
:fn main() {
let entry = "1 2 3 4 5 command \"much whitespace\"";
let mut last_whitespace = false;
let parts = entry.splitn(6, |c: char| {
if c.is_whitespace() {
if last_whitespace {
return false
}
last_whitespace = true;
true
} else {
last_whitespace = false;
false
}
}).map(str::trim);
let x: Vec<_> = parts.collect();
println!("{:?}", x);
}
多余的空格被视为以下子字符串的一部分,因此我们需要额外修剪每个子字符串。
关于rust - 如何在 Rust 中结合 splitn 和 split_whitespace?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49143986/