首页 > 解决方案 > 如何找到另一个字符串的字符串切片的起始偏移量?

问题描述

给定一个字符串和一个引用某个子字符串的切片,是否可以找到切片的开始和结束索引?

我有一个ParseString函数,它接受对字符串的引用,并尝试根据一些语法对其进行解析:

ParseString(inp_string: &str) -> Result<(), &str>

如果解析没问题,结果就是Ok(()),但如果有错误,通常在某个子字符串中,错误实例是Err(e),其中e是该子字符串的切片。

当给出发生错误的子字符串时,我想说“从字符 x 到 y 的错误”,其中 x 和 y 是错误子字符串的开始和结束索引。

我不想直接在 中编码错误的位置Err,因为我正在嵌套这些调用,并且嵌套切片中的偏移量可能与顶级字符串中的某个切片不对应。

标签: stringrust

解决方案


只要您的所有字符串切片都从同一个字符串缓冲区借用,您就可以使用简单的指针算法计算偏移量。您需要以下方法:

  • str::as_ptr():返回指向字符串切片开头的指针
  • 一种获取两个指针之间差异的方法。现在,最简单的方法是将两个指针都转换为usize(始终是空操作),然后减去它们。在夜间,有一种不稳定的方法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));
}

推荐阅读