你如何逐个字符地迭代

use*_*584 50 string iterator rust

我有一个字符串,我需要扫描每次出现的"foo"并读取其后的所有文本,直到一秒钟".由于Rust没有contains字符串函数,我需要通过字符扫描来迭代它.我该怎么做?

编辑:Rust &str有一个contains()find()方法.

cen*_*lug 83

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

.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`
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

let my_chars: Vec<_> = mystr.chars().collect();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,以这种方式获得的字符可能与人类感知的字符的直观定义不符。有关更多详细信息,请参阅 https://github.com/unicode-rs/unicode-segmentation。 (3认同)

Ibr*_*med 30

“字符”的概念非常模糊,根据您所使用的数据类型,它可能意味着许多不同的事物。最明显的答案是chars方法。然而,这并不像宣传的那样有效。对您来说看似单个“字符”的内容实际上可能由多个 Unicode代码点组成,这可能会导致意外结果:

\n
"a\xcc\x90".chars() // => [\'a\', \'\\u{310}\']\n
Run Code Online (Sandbox Code Playgroud)\n

对于大量字符串处理,您需要使用graphemes。字素由表示为字符串切片的一个或多个 unicode 代码点组成。这些更好地映射了人类对“角色”的感知。要创建字素迭代器,您可以使用unicode-segmentationcrate:

\n
use unicode_segmentation::UnicodeSegmentation;\n\nfor grapheme in my_str.graphemes(true) {\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您使用的是原始 ASCII,那么上述情况都不适合您,您可以简单地使用迭代bytes器:

\n
for byte in my_str.bytes() {\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

不过,如果您使用 ASCII,那么可以说您根本不应该使用String/ ,而应该直接使用/ 。&strVec<u8>&[u8]

\n

  • @DawidLaszuk String 不能直接索引,必须执行额外的 utf8 检查才能操作。直接使用字节更容易,开销也更少。 (5认同)
  • 最后一句话很有趣。有任何关于为什么不建议将 String 用于简单 ASCII 的指示吗?我正在学习 Rust。 (3认同)

小智 5

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

输出:Rust 是一种编程语言

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

  • 抱歉,但这会给已接受的答案添加什么? (4认同)