给定一个字符串和一个引用某个子字符串的切片,是否可以找到切片的开始和结束索引?
我有一个 ParseString
函数,它接受一个字符串的引用,并尝试根据某种语法解析它:
ParseString(inp_string: &str) -> Result<(), &str>
如果解析没问题,结果就是Ok(())
,但如果有错误,通常是在某个子字符串中,错误实例是Err(e )
,其中 e
是该子字符串的一部分。
当给出发生错误的子字符串时,我想说类似“字符 x 到 y 的错误”,其中 x 和 y 是错误子字符串的起始和结束索引。
我不想直接在 Err
中编码错误的位置,因为我正在嵌套这些调用,并且嵌套切片中的偏移量可能与顶级字符串。
只要您的所有字符串切片都从同一个字符串缓冲区借用,您就可以使用简单的指针算法计算偏移量。您需要以下方法:
-
str::as_ptr()
: 返回指向字符串切片开始的指针
- 一种获取两个指针之间差异的方法。现在,最简单的方法是将两个指针都转换为
usize
(这始终是一个空操作),然后减去它们。在 1.47.0+ 上,有一个方法 offset_from()
哪个稍微好一点。
这是工作代码(Playground):
fn get_range(whole_buffer: &str, part: &str) -> (usize, usize) {
let start = part.as_ptr() as usize - whole_buffer.as_ptr() as usize;
let end = start + part.len();
(start, end)
}
fn main() {
let input = "Everyone ♥ Ümläuts!";
let part1 = &input[1..7];
println!("'{}' has offset {:?}", part1, get_range(input, part1));
let part2 = &input[7..16];
println!("'{}' has offset {:?}", part2, get_range(input, part2));
}