【问题标题】:How do you iterate over a string by character你如何逐个字符地遍历一个字符串
【发布时间】:2014-04-02 19:35:35
【问题描述】:

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

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

【问题讨论】:

  • 您能否展示一些输入与您想要的输出的示例?这将帮助我们更清楚地了解您正在努力完成的确切目标。
  • 这里有一个这样的循环示例rustbyexample.org/loops.html,尽管我认为有更简单的方法。
  • 请注意,有很多字符串搜索算法,它们的时间复杂度并不是直接的方法(O(n*m))。 en.wikipedia.org/wiki/String_searching_algorithm
  • 这听起来像正则表达式。

标签: string iterator rust


【解决方案1】:

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

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

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 代码点,而不是简单的字符向量。

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

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

【讨论】:

【解决方案2】:

“字符”的概念非常模糊,根据您使用的数据类型,它可能意味着许多不同的东西。最明显的答案是chars 方法。但是,这并不像宣传的那样起作用。对您来说看起来像一个“字符”的东西实际上可能由多个 Unicode 代码点组成,这可能会导致意想不到的结果:

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

对于实际的字符串处理,您希望使用 graphemes。一个字形由一个或多个表示为字符串切片的 unicode 代码点组成。这些更好地映射到人类对“字符”的感知。要创建字素迭代器,可以使用unicode-segmentation crate:

use unicode_segmentation::UnicodeSegmentation;

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

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

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

不过,如果您使用的是 ASCII,那么可以说您根本不应该使用 String/&amp;str,而是使用 Vec&lt;u8&gt;/&amp;[u8]ascii crate。

【讨论】:

  • 有趣的最后一句话陈述。关于为什么不建议将 String 用于简单 ASCII 的任何指针?我正在学习 Rust。
  • @DawidLaszuk 字符串不能被直接索引,并且必须执行额外的 utf8 检查才能进行操作。直接使用字节更容易,开销也更少。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多