代码之家  ›  专栏  ›  技术社区  ›  Gaurang Tandon

以锈色分割字符串,将连续分隔符视为一个分隔符

  •  0
  • Gaurang Tandon  · 技术社区  · 4 年前

    如何将字符串拆分为Rust,以便将连续的分隔符合并为一个分隔符?例如:

    "1  2 3".splitX(" ")
    

    应该会产生这样的结果 Vec : ["1", "2", "3"] (当从分割对象或任何其他中间对象收集时)。这个例子是针对空格的,但我们也应该能够将其扩展到其他分隔符。

    我相信我们可以利用 .filter() 使用后删除空项的步骤 .split() ,但如果能把它作为原作的一部分,那就更干净了 .split() 直接地显然,我彻底地搜索了这个问题,很惊讶我在任何地方都找不到答案。

    我知道我们已经有了空白 split_whitespace() split_ascii_whitespace() ,但我正在寻找一种适用于通用分隔符字符串的解决方案。

    1 回复  |  直到 4 年前
        1
  •  3
  •   Stargateur    4 年前

    标准溶液是 split 然后 filter :

    let output: Vec<&str> = input
        .split(pattern)
        .filter(|s| !s.is_empty())
        .collect();
    

    这是快速而清晰的。

    还可以使用正则表达式来避免筛选步骤:

    let output: Vec<&str> = regex::Regex::new(" +").unwrap()
        .split(input)
        .collect();
    

    如果它位于一个将被多次调用的函数中,可以避免使用lazy_Regex重复正则表达式编译:

    let output: Vec<&str> = lazy_regex::regex!(" +")
        .split(input)
        .collect();
    
        2
  •  1
  •   cameron1024    4 年前

    在我看来,到目前为止,最干净的方式就是写作 .split(" ").filter(|s| !s.is_empty()) .它适用于所有分隔符,阅读代码的意图显而易见。

    如果这太“丑陋”,你或许可以把它归结为一个特征:

    trait SplitNonEmpty {
      // you might want to define your own struct for the return type
      fn split_non_empty<'a, P>(&self, p: P) where P: Pattern<'a> -> ...;
    }
    
    impl SplitNonEmpty for &str {
      // ...
    }
    

    如果这个函数返回 Split ,您可能需要重构代码以更多地使用traits;你真的在乎它是通过拆分一个字符串创建的,还是在乎你可以迭代它?如果是这样的话,这个函数可能需要一段时间 impl IntoIterator<&'a str> ?

        3
  •  0
  •   manu    4 年前

    正如其他人所说, split filter 或者 regex 这里更好。但有一种模式可以使用 flat_map .虽然在这种情况下,它没有增加多少价值。

    fn main() {
        let output: Vec<&str> = "1  2 3"
            .split(" ")
            .flat_map(|x| if !x.is_empty() { Some(x) } else { None })
            .collect();
        println!("{:#?}", output)
    }
    

    例如,如果您想将这些字符串解析为数字并忽略错误值,可以使用这种模式。

    fn main() {
        let output: Vec<i32> = "1  2 3"
            .split(" ")
            .flat_map(|x| x.parse())
            .collect();
        println!("{:#?}", output)
    }
    

    全部的 平面图 关心是结束,返回实现的东西 IntoIterator

    推荐文章