如何从字符串中删除换行符?

8

我正在尝试从一个字符串(从文件读取的文件内容)中删除换行符并将其转换为 Vec<u8>

示例输入字符串:

let ss = String::from("AAAAAAAA\nBBBBBBBBB\nCCCCCC\nDDDDD\n\n");

fn parse(s: String) -> Vec<u8> {
    let s = s.chars().skip_while(|c| *c == '\n');
    let sett = s.into_iter().map(|c| c as u8).collect();
    sett
}

虽然我没有收到任何错误信息,但是skip_while似乎没有从字符串中移除换行符。我在这里做错了什么?

1个回答

5
你可以基本上替换字符串中的\n,然后使用into_bytes()将其转换为Vec<u8>
fn parse(s: String) -> Vec<u8> {
    s.replace("\n", "").into_bytes()
}

如果你想使用迭代器实现,可以使用filter函数:
fn parse(s: String) -> Vec<u8> {
    s.chars().filter(|c| *c != '\n').map(|c| c as u8).collect()
}

您可以按照以下方式进行调用:

use std::str::from_utf8;

fn main() {
    let my_string = String::from("AAAAAAAA\nBBBBBBBBB\nCCCCCC\nDDDDD\n\n");
    let parsed_string = parse(my_string.clone());
    println!("{:?}", from_utf8(&parsed_string));
}

Playground


4
将字符转换为u8并不是一个好的做法,在这种情况下应该直接使用bytes() - Stargateur
1
您的条件有误。即使您更正,它也不是您所要求的行为。它会跳过直到第一次出现,而且您得到的字符串只是跳过/n之前的第一部分。游乐场 - Akiner Alkan
1
@RussellB:在函数式语言中,“take”和“skip”是常见的列表操作:“take”将返回前缀列表,“skip”将返回后缀。还有一些变体:取/跳过一定数量的元素,以及在谓词为真或直到谓词为真时取/跳过。 “skip_while”继承了这个传统,因此只要谓词为真就跳过元素,然后返回剩余的内容。在您的情况下,由于第一个元素上的谓词为假,它立即停止跳过并返回整个列表。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接