我正在尝试拆分 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<'_> 实现”
  • 我不能简单地复制 str.rs 中 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/

    10-11 02:54