- 此问题在此处已有答案**:
How to get the byte offset between &str
(2个答案)
三年前关闭了。
给定一个字符串和一个引用某个子字符串的切片,是否有可能找到切片的起始和结束索引?
我有一个ParseString
函数,它接受一个字符串的引用,并试图根据一些语法来解析它:
ParseString(inp_string: &str) -> Result<(), &str>
如果解析正常,结果就是Ok(())
,但是如果有错误,通常是在某个子字符串中,错误示例是Err(e)
,其中e
是该子字符串的一个切片。
当给定发生错误的子字符串时,我想说类似于"Error from characters x to y"的话,其中x和y是错误子字符串的开始和结束索引。
我不想直接在Err
中编码错误的位置,因为我嵌套了这些调用,并且嵌套切片中的偏移量可能与顶级字符串中的some切片不对应。
2条答案
按热度按时间cbjzeqam1#
只要所有的字符串切片都是从同一个字符串缓冲区借用的,就可以用简单的指针算法计算偏移量,需要使用以下方法:
str::as_ptr()
:返回指向字符串切片开始的指针usize
(这总是一个空操作),然后减去它们。在1.47.0+中,有一个方法offset_from()
,稍微好一点。下面是工作代码(Playground):
cig3rfwq2#
Rust实际上曾经有一个不稳定的方法来完成这个任务,但是it was removed due to being obsolete,考虑到the replacement didn't remotely have the same functionality,这有点奇怪。
也就是说,实现并不是很大,所以您只需将以下代码添加到代码的某个位置:
如果不需要支持Rust的旧版本,可以删除
_stable
后缀;它只是为了避免与现已删除的subslice_offset
方法发生名称冲突。