在二进制缓冲区上有一个&[u8]片。我需要解析它,但是我想使用的很多方法(比如str::find)似乎在切片上不可用。
我已经看到,我可以通过缓冲区切片和使用str将模式转换为from_utf8_unchecked(),但这似乎有点危险(而且也非常棘手)。
我怎样才能在这个片段中找到子序列?实际上,我需要模式的索引,而不仅仅是部分的切片视图,所以我认为split不起作用。

最佳答案

下面是一个基于windows迭代器的简单实现。

fn find_subsequence(haystack: &[u8], needle: &[u8]) -> Option<usize> {
    haystack.windows(needle.len()).position(|window| window == needle)
}

fn main() {
    assert_eq!(find_subsequence(b"qwertyuiop", b"tyu"), Some(4));
    assert_eq!(find_subsequence(b"qwertyuiop", b"asd"), None);
}

find_subsequence函数也可以设为泛型:
fn find_subsequence<T>(haystack: &[T], needle: &[T]) -> Option<usize>
    where for<'a> &'a [T]: PartialEq
{
    haystack.windows(needle.len()).position(|window| window == needle)
}

关于rust - 如何在&[u8]切片中找到子序列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39945487/

10-11 03:54