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