簡體   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