首页 > 解决方案 > 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());

鉴于以下情况,我完全不知道从哪里开始:

有内置的东西吗?还是我需要遍历一个std::str::Chars迭代器?

如果是这样,我将如何从Chars给定字符的迭代器转到表示下一个单词的字符串?有没有一种安全的方法可以从函数中返回它?(到目前为止,编译器从未让我这样做)

标签: rust

解决方案


您可以利用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());
}

推荐阅读