string - 如何找到另一个字符串的字符串切片的起始偏移量?

标签 string rust

<分区>

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

我有一个 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));
}

关于string - 如何找到另一个字符串的字符串切片的起始偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781561/

相关文章:

ios - @""的替代品?

javascript - 需要转换JSON格式

proxy - 在防火墙后面时,如何在 Windows 上使用 rustup 安装 Rust?

rust - 无法编译 Rust 构建器模式,因为借用的值生命周期不够长

opengl - 如何在OpenGL中更改纹理的位置?

iphone - 如何解码iPhone中的字符串

C# 替换字符串,除非前面有另一个

Python 字符串连接性能

rust - llvm-sys - 没有找到可用的系统级 LLVM

multithreading - 在 Rayon 线程内调用 `Arc::new()` 会导致垃圾编译器错误