如何逐字符迭代字符串

我有一个字符串,我需要扫描“ foo”的每一次出现,并阅读它后面的所有文本,直到第二个 "因为 Rust 对字符串没有 contains函数,我需要通过字符扫描来迭代它。我要怎么做?

编辑 : Rust 的 &str具有 contains()find()方法。

118805 次浏览

我需要通过字符扫描来迭代它。

.chars()返回字符串中字符的迭代器。

for c in my_str.chars() {
// do something with `c`
}


for (i, c) in my_str.chars().enumerate() {
// do something with character `c` and index `i`
}

如果您对每个字符的字节偏移量感兴趣,可以使用 char_indices

查看 .peekable(),并使用 peek()来展望未来。之所以这样包装,是因为它支持 UTF-8代码点,而不是简单的字符向量。

你也可以创建一个 char的向量,然后从那里开始工作,但这需要更多的时间和空间:

let my_chars: Vec<_> = mystr.chars().collect();

“字符”的概念非常模棱两可,可能意味着许多不同的东西,这取决于您使用的数据类型。最明显的答案是 chars方法。然而,这并不像宣传的那样有效。看起来像一个“字符”的东西实际上可能是由多个 Unicode 密码点组成的,这可能导致意想不到的结果:

"a̐".chars() // => ['a', '\u{310}']

对于大量字符串处理,需要使用 字母。一个字形由一个或多个 Unicode 代码点组成,这些代码点表示为一个字符串片。这些更好地映射到人类对“字符”的感知。要创建一个字母迭代器,您可以使用 unicode-segmentation板条箱:

use unicode_segmentation::UnicodeSegmentation;


for grapheme in my_str.graphemes(true) {
// ...
}

如果您使用的是原始 ASCII,那么以上所有方法都不适用于您,您可以简单地使用 bytes迭代器:

for byte in my_str.bytes() {
// ...
}

尽管如此,如果您使用的是 ASCII,那么可以说根本不应该使用 String/&str,而应该直接使用 Vec<u8>/&[u8]

fn main() {
let s = "Rust is a programming language";
for i in s.chars() {
print!("{}", i);
}}

输出: Rust 是一种编程语言

我使用 chars ()方法迭代字符串的每个元素。