繁体   English   中英

拆分字符串并跳过空子字符串

[英]Split string and skip empty substrings

我正在学习 Rust 并发现了这个问题:

我想按模式拆分字符串并删除结果 substring 为空的所有情况。

这是一个例子:

let s = "s,o,m,e,";
for elem in s.split(",").skip_while(|&x| x.is_empty()) {
    print!(" <{}> ", elem);
    //print!(" <{}>({}) ", elem, elem.is_empty());
}

但结果如下:

 <s>  <o>  <m>  <e>  <> 

我的想法是: split返回的结构Split实现了提供skip_whileIterator IntelliSense 告诉我闭包中的x&&str类型,所以我假设迭代器的所有元素(类型&str )都是空的,可以省略。

但它不会跳过空的 substring。

我还尝试打印is_empty function 的结果。 它表明最后一个切片确实是空的。 如果我代替 skip_while 使用skip_while(|&x| x == "s") ,它正确地省略了"s" (在这里用is_empty打印):

 <o>(false)  <m>(false)  <e>(false)  <>(true)

那么切片在迭代器中的行为以某种方式不同?

为什么会这样或者我在哪里弄错了?

如果您只需要在输入末尾省略 1 个空字符串,只需使用split_terminator而不是split 这个适配器基本上就像split但是它将模式参数视为终止符而不是分隔符,因此输入末尾的空字符串不被视为新元素。

如果您真的想跳过所有空字符串,请继续阅读。


skip_while完全按照其文档中的说明进行操作(强调我的):

skip_while()将闭包作为参数。 它将在迭代器的每个元素上调用此闭包,并忽略元素,直到它返回false

返回false后, skip_while()的工作就结束了,产生了元素的 rest。

过滤掉与谓词匹配的所有元素,无论它们在序列中的哪个位置,都是filter的工作:

let s = ",s,o,,m,e,";
for elem in s.split(",").filter(|&x| !x.is_empty()) {
    print!(" <{}> ", elem);
}

上面的代码会有你想要的效果。

请注意, filter谓词与skip_while的含义相反:它不是为不应产生的元素返回true ,而是为应该产生的元素返回true

skip_while忽略元素,直到它返回 false ,也就是说,在您的情况下,它将采用第一个非空字符串之后的所有元素。 例如,给定:

let s = ",,s,o,m,e,";

skip_while将忽略前两个空字符串,但保留最后一个:

let s = ",,s,o,m,e,";
for elem in s.split(",").skip_while(|&x| x.is_empty()) {
    print!(" <{}> ", elem);
}

将打印:

<s>  <o>  <m>  <e>  <> 

对于您的情况,您似乎只需要filter

let s = "s,o,m,e,";
for elem in s.split(",").filter(|&x| !x.is_empty()) {
    print!(" <{}> ", elem);
}

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM