代码之家  ›  专栏  ›  技术社区  ›  l0b0

如何在Rust中组合splitn和split\u空格?

  •  3
  • l0b0  · 技术社区  · 6 年前

    我正在尝试拆分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 在str.rs中,因为 std::std_unicode::str::UnicodeStr 是私人的。

    有没有一种简洁的方法来组合这些?

    2 回复  |  直到 6 年前
        1
  •  3
  •   MB-F    6 年前
    entry.splitn(6, char::is_whitespace)
    

    对于示例字符串应正常工作。也就是说,如果字段正好由一个空格字符分隔。如果您确定crontab条目就是这种情况,那么这种方法就足够了。然而,正如@DK中所指出的s的答案是,如果字段之间碰巧有额外的空格,则每个字段都将导致拆分。

    例如 "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);
    }
    

    额外的空格被视为以下子字符串的一部分,因此我们需要额外修剪每个子字符串。

        2
  •  3
  •   DK.    6 年前

    有没有一种简洁的方法来组合这些?

    不可以。不能将迭代器用作谓词;他们根本不是一回事。

    您不需要访问内部Unicode模块来测试是否有空格: char::is_whitespace 确实如此。这个 问题 是吗 split_whitespace 不仅仅是 s.split(char::is_whitespace) split 在拆分之间包含空子字符串, 拆分\u空格 没有。因此,如果您在输入中有额外的空格,这些空格将“吃掉”您想要执行的有限数量的拆分之一。

    正确的解决方案是实现自定义 Pattern 匹配连续运行的空白字符。 是,但不是,因为 图案 自2015年8月以来一直不稳定,短期内没有稳定的迹象。

    如果我处在你的位置,我会手工解析字符串。