replace - 如何找到每个匹配的 byte slice 并将其替换为另一个片?

标签 replace rust slice

我有一个字节向量,想用 [4, 5, 6] 替换每个 [1, 2, 3]。这在 Rust 中怎么可能?

let mut buf = vec![1, 2, 3, 7, 8];

// ?

assert_eq!(buf, vec![4, 5, 6, 7, 8]);

最佳答案

这个函数可以完成这个工作:

fn replace_slice<T>(source: &mut [T], from: &[T], to: &[T])
where
    T: Clone + PartialEq,
{
    let iteration = if source.starts_with(from) {
        source[..from.len()].clone_from_slice(to);
        from.len()
    } else {
        1
    };

    if source.len() > from.len() {
        replace_slice(&mut source[iteration..], from, to);
    }
}

此函数是递归的,但您也可以使用循环重写它。


示例 1:

fn main() {
    let mut buf = vec![1, 2, 3, 7, 8, 1, 2, 3];

    replace_slice(&mut buf[..], &[1, 2, 3], &[4, 5, 6]);

    assert_eq!(buf, vec![4, 5, 6, 7, 8, 4, 5, 6]);
}

Playground


示例 2: (来自 trentcl 的评论)

fn main() {
    let mut buf = vec![1, 2, 3, 3, 4, 1, 2, 3];

    replace_slice(&mut buf[..], &[1, 2, 3], &[5, 1, 2]);

    assert_eq!(buf, vec![5, 1, 2, 3, 4, 5, 1, 2]);
}

Playground

关于replace - 如何找到每个匹配的 byte slice 并将其替换为另一个片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150353/

相关文章:

html - Safari 在放大/缩小时会弄乱设计

ubuntu - 如何用一个字符替换多个字符?

java - 替换 ViewPager fragment

core-data - Swift - 用 iCloud 核心数据替换核心数据

c - 如何用c语言编写替换函数

rust - 在Rust中读取ZIP文件会导致当前函数拥有的数据

python - 在同一行从列表中切片和删除

rust - FFI基本类型大小

rust - Rust 的 C++ Friend-like 构造

go - Go 中的问题,附加到 []byte,写入文件并读取它