在二进制缓冲区上有一个&[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/