string - 如何找到另一个字符串的字符串切片的起始偏移量?
问题描述
给定一个字符串和一个引用某个子字符串的切片,是否可以找到切片的开始和结束索引?
我有一个ParseString
函数,它接受对字符串的引用,并尝试根据一些语法对其进行解析:
ParseString(inp_string: &str) -> Result<(), &str>
如果解析没问题,结果就是Ok(())
,但如果有错误,通常在某个子字符串中,错误实例是Err(e)
,其中e
是该子字符串的切片。
当给出发生错误的子字符串时,我想说“从字符 x 到 y 的错误”,其中 x 和 y 是错误子字符串的开始和结束索引。
我不想直接在 中编码错误的位置Err
,因为我正在嵌套这些调用,并且嵌套切片中的偏移量可能与顶级字符串中的某个切片不对应。
解决方案
只要您的所有字符串切片都从同一个字符串缓冲区借用,您就可以使用简单的指针算法计算偏移量。您需要以下方法:
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));
}
推荐阅读
- tsql - 报告 - 按周数和年份的 SQL 组
- terminal - 安装 create-react-app 时遇到问题...出现此错误找不到模块 'rxjs'
- keras - 嵌入层和 Conv1D。数据格式错误
- python - Python 和 Tkinter,将列表信息从一个函数传递到另一个函数
- python - 限制 Dask CPU 和内存使用(单节点)
- python - 使用 Python 访问智能卡 - Windows 操作系统上的 PyKCS11 - 库问题
- c# - DropDownListFor 在回发时返回一个空列表
- python-3.x - 二进制模式下的 Python 3 open() 未写入正确的内容
- php - PHPUnit 模拟函数调用
- ios - iOS FileManager 是线程安全的意味着什么?