Rust:拆分字符串以获取单词及其位置

Rust:拆分字符串以获取单词及其位置,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 = ??????(&

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
    函数“消耗”了空白,因此我不知道给定元素前面会出现多少空白。我应该从拆分(“”)开始,并以某种方式将非空白“分组”在一起吗

  • 有一个函数可以执行类似的操作,但它只能查找给定的字符串或字符(使用闭包)

有什么内置的吗?或者我需要迭代
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());
}
fn addr\u of(s:&str)->使用{
s、 as_ptr()as usize
}
fn分割\空白\索引(s:&str)->impl迭代器{
s、 拆分空格()
.map(移动| sub |(sub的地址)-sub的地址)
}
fn main(){
让mut iter=split_whitespace_index(“Hello world”);
断言(一些((1,“你好”)),iter.next();
断言eq!(一些((7,“世界”)),iter.next();
}

“有一个match_index函数可以执行类似的操作,但它只能查找给定的字符串或字符(使用闭包)。”模式也可以是单独的字符。无论如何,match_索引有什么问题吗?就我阅读的
match_索引
文档而言,它不允许您要求
将字符串按任何非空白的所有组分割,并为每个组提供组中第一个元素的索引
。或者可以吗?我从来没用过匹配索引。。。我认为它不太常用,如果你想进行真正的解析,我建议使用nom 6,我认为这对unicode字符(例如“λello world”)来说会失败。@lpiepiora没有理由它会失败,为什么你会这样认为@lpiepiora它不会失败,它将返回字节索引。这与将索引返回到字符串中的其他函数(如
char\u index()
match\u index()
)是一致的,这也是
str
上的切片操作所期望的。@phtrivier在这种情况下,我认为没有理由在工作中使用短引号。返回的索引是使用通常的切片操作从原始字符串获取子字符串所需的索引,因此它们对于任何代码点都是完全正确的
char_index()
docs不会对索引发出警告,而是对迭代器生成的字符发出警告,这些字符始终是单独的代码点,而不是字符集。此函数不会将字符串拆分为单独的代码点,而是拆分为仅由空格分隔的子字符串,因此它没有这个问题。@phtrivier为了澄清,如果您不是母语人士,“scare quotes”是一个英语习语。我并不是想暗示你实际上是想吓唬某人