Rust不使用正規表示式如何刪除字串中的無用空格?

banq發表於2022-10-06

Rust中替換字串的空格:將兩個空格減為一個,並移除\n、\r\n、製表符前後的空格:

fn magic(input: &str) -> String {
    input

        // 修剪前面和後面的空格
        .trim()
        // 分割成行
        .lines()
        .map(|part| {
            // 對於每一行
            part
                // 修剪前導和尾部的空白處
                .trim()
                //對空白處進行分割。
                //包括字串被分割的空白處
                // 分割後的部分
                .split_inclusive(char::is_whitespace)
                // 過濾掉只包含空白的子字串
                .filter(|part| !part.trim().is_empty())
                //為這一行收整合一個字串
                .collect()
        })
        //收整合一個字串的Vec
        .collect::<Vec<String>>()
        //用換行符連線這些字串
        //返回到最終的字串中
        .join("\n")
}


playground


或者:

fn magic(input: &str) -> String {
    let mut output: String = input
        // trim leading and trailing space
        .trim()
        // split into lines
        .lines()
        .flat_map(|part| {
            // for each line
            part
                // trim leading and trailing space
                .trim()
                // split on whitespace
                // including the space where the string was split
                .split_inclusive(char::is_whitespace)
                // filter out substrings containing only whitespace
                .filter(|part| !part.trim().is_empty())
                // add a newline after each line
                .chain(["\n"])
        })
        // collect into a String
        .collect();
    
    // remove the last newline
    output.truncate(output.len() - 1);
    
    output
}

#[test]
fn test() {
    // assert_eq!(&magic("  "), " ");
    
    assert_eq!(
        &magic("     a l    l   lower      "),
        "a l l lower"
    );
    
    assert_eq!(
        &magic("     i need\nnew  lines \n\nmany   times     "),
        "i need\nnew lines\n\nmany times"
    );
    
    assert_eq!(&magic("  à   la  "), "à la");
}


playground

相關文章