rust - Rust:拆分字符串以获取单词及其位置
问题描述
Rust 有内置的函数来在空格周围分割一个字符串,比如:
let mut iter = " Hello world".split_whitespace();
assert_eq!(Some("Hello"), iter.next());
assert_eq!(Some("world"), iter.next());
但是,我想要一种将字符串拆分为单词的方法,以及它们在字符串中的相应位置。
let mut iter = ??????(" Hello world");
assert_eq!(Some((1, "Hello")), iter.next());
assert_eq!(Some((7, "world")), iter.next());
鉴于以下情况,我完全不知道从哪里开始:
内置
split
和split_whitespace
函数“消耗”空白,所以我不知道给定元素之前出现了多少空白。我应该从 开始split('')
,并以某种方式将非空白“分组”在一起吗?有一个
match_indices
函数可以做类似的事情,但它只能查找给定的字符串或字符(使用闭包。)
有内置的东西吗?还是我需要遍历一个std::str::Chars
迭代器?
如果是这样,我将如何从Chars
给定字符的迭代器转到表示下一个单词的字符串?有没有一种安全的方法可以从函数中返回它?(到目前为止,编译器从未让我这样做)
解决方案
您可以利用split_whitespace()
返回指向原始切片的切片的事实,并将所需的索引计算为原始切片地址与每个子切片地址的距离:
fn addr_of(s: &str) -> usize {
s.as_ptr() as usize
}
fn split_whitespace_indices(s: &str) -> impl Iterator<Item = (usize, &str)> {
s.split_whitespace()
.map(move |sub| (addr_of(sub) - addr_of(s), sub))
}
fn main() {
let mut iter = split_whitespace_indices(" Hello world");
assert_eq!(Some((1, "Hello")), iter.next());
assert_eq!(Some((7, "world")), iter.next());
}
推荐阅读
- python - 如何在 Flask Sqlalchemy 中使用带有条件的过滤器查询表?
- python - 如何在图像中添加时间戳作为水印或将名称输出为当前时间
- git - 为什么我看到修改后的文件隐藏在 .gitignore 中?
- c# - 在更新服务类中的条目时模拟 DbContext 实体状态
- docker - 使用 ARG 进行替换会导致 `docker run` 失败
- java - 通过 javax.script 在 Java 中编写脚本:无法检索 Python 的 ScriptEngine
- python-3.x - 单元测试模拟 return_value 无法正常工作
- ios - 带有 URLSession 的 Swift 代理 SOCKS5
- typescript - 滚动事件是否有预定义的 DOM 事件对象?
- php - 一般错误:1364 字段 'uuid' 没有默认值