如何在 Rust 中查找字符串中字符的索引?

30

我有一个字符串变量“Program”,想要找到其中字符'g'的索引位置。


有不同类型的字符串索引,因为您可以在许多级别上进行计数。计算字节会给出字节索引(字符开始的字节),计算图形元素会给出图形元素索引,计算代码点会给出代码点索引。 - hkBst
3个回答

61

虽然有点复杂,但另一个解决方案是使用Chars迭代器和它的position()函数:

"Program".chars().position(|c| c == 'g').unwrap()

find用于已接受的解决方案中返回字节偏移量,而不一定是字符索引。它适用于基本ASCII字符串,如问题中的字符串,虽然在使用多字节Unicode字符串时也会返回值,但将结果值视为字符索引将会导致问题。

以下内容有效:

let my_string = "Program";
let g_index = my_string.find("g");   // 3
let g: String = my_string.chars().skip(g_index).take(1).collect();
assert_eq!("g", g);   // g is "g"

这不起作用:

let my_string = "プログラマーズ";
let g_index = my_string.find("グ");    // 6
let g: String = my_string.chars().skip(g_index).take(1).collect();
assert_eq!("グ", g);    // g is "ズ"

2
Find返回起始字节索引,因此不应将其用作字符索引。因此,不应将其与chars().skip()一起使用,而应该用于切片:let g: String = my_string[g_index..].chars().take(1).collect();这样无论您使用什么类型的字符都可以正常工作。 - hkBst

39

您正在寻找与字符串相关的 find 方法。要查找 "Program"'g' 的索引,可以执行以下操作:

"Program".find('g')
"Program".find('g')

查找相关文档


4
如果您的单词中有几个字母"g",您可以使用 "enumerate" 找到所有索引:
"ඞggregate"
    .chars()
    .enumerate()
    .filter(|(_, c)| *c == 'g')
    .map(|(i, _)| i)
    .collect::<Vec<_>>();  // [1, 2, 5]

如果字符串只包含ASCII字符:
"aggregate"
    .bytes()
    .enumerate()
    .filter(|(_, b)| *b == b'g')
    .map(|(i, _)| i)
    .collect::<Vec<_>>();  // [1, 2, 5]

Playground


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接