Как я могу обрабатывать данные новыми строками, пока не найду две строки подряд, а затем обработать все оставшиеся данные? - PullRequest
1 голос
/ 07 июня 2019

У меня есть Vec<u8>, который я хочу разделить на \n и обработать его построчно.В какой-то момент появляется пустая строка, и я хочу обработать весь оставшийся вектор в одном фрагменте (не построчно).Подобные вещи распространены в HTTP или в объектах коммитов Git.

Например:

key: value
otherkey: othervalue

This is the content
that is now just a big
block. I don't care about
newlines here.

Есть ли элегантный способ разобрать это с Rust?Я могу разделить это следующим образом:

pub fn main() {
    let data: Vec<u8> = "key: value\notherkey: othervalue\n\nThis is the content\nthat is now just a big\nblock. I don't care about\nnewlines here.".as_bytes().to_owned();

    for line in data.split(|&c| c == '\n' as u8) {
        println!("Line: {:?}", line);
        if line.len() == 0 {
            // Start of message...
        } else {
            // Header
        }
    }
}

Однако, когда я добираюсь до \n\n, я не могу найти способ сказать "дай мне оставшуюся часть Vec отсюда".Было бы легко, если бы существовала форма split(), которая возвращала бы фрагменты с индексами вместо фактического содержимого, но я не могу найти ни одного.

Существует ли элегантный способ сделать это, чтоне просто разделить сообщение и затем снова присоединиться к нему?

1 Ответ

2 голосов
/ 08 июня 2019

Вы можете легко получить длину каждого среза, отслеживая текущее смещение и сделать последний срез самостоятельно:

static DATA: &[u8] = br#"key: value
otherkey: othervalue

This is the content
that is now just a big
block. I don't care about
newlines here.
"#;

pub fn main() {
    let mut offset = 0;

    for line in DATA.split(|&c| c == '\n' as u8) {
        offset += line.len() + 1; // Include the newline.
        if line.len() == 0 {
            break;
        } else {
            // Header
            println!("{:?}", line);
        }
    }

    let body = &DATA[offset..];
    println!("{:?}", body);
}

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...