我有一个字符串,我需要扫描“ foo”的每一次出现,并阅读它后面的所有文本,直到第二个 "。因为 Rust 对字符串没有 contains函数,我需要通过字符扫描来迭代它。我要怎么做?
"
contains
编辑 : Rust 的 &str具有 contains()和 find()方法。
&str
contains()
find()
我需要通过字符扫描来迭代它。
.chars()法返回字符串中字符的迭代器。
.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。
char_indices
查看 .peekable(),并使用 peek()来展望未来。之所以这样包装,是因为它支持 UTF-8代码点,而不是简单的字符向量。
.peekable()
peek()
你也可以创建一个 char的向量,然后从那里开始工作,但这需要更多的时间和空间:
char
let my_chars: Vec<_> = mystr.chars().collect();
“字符”的概念非常模棱两可,可能意味着许多不同的东西,这取决于您使用的数据类型。最明显的答案是 chars方法。然而,这并不像宣传的那样有效。看起来像一个“字符”的东西实际上可能是由多个 Unicode 密码点组成的,这可能导致意想不到的结果:
chars
"a̐".chars() // => ['a', '\u{310}']
对于大量字符串处理,需要使用 字母。一个字形由一个或多个 Unicode 代码点组成,这些代码点表示为一个字符串片。这些更好地映射到人类对“字符”的感知。要创建一个字母迭代器,您可以使用 unicode-segmentation板条箱:
unicode-segmentation
use unicode_segmentation::UnicodeSegmentation; for grapheme in my_str.graphemes(true) { // ... }
如果您使用的是原始 ASCII,那么以上所有方法都不适用于您,您可以简单地使用 bytes迭代器:
bytes
for byte in my_str.bytes() { // ... }
尽管如此,如果您使用的是 ASCII,那么可以说根本不应该使用 String/&str,而应该直接使用 Vec<u8>/&[u8]。
String
Vec<u8>
&[u8]
fn main() { let s = "Rust is a programming language"; for i in s.chars() { print!("{}", i); }}
输出: Rust 是一种编程语言
我使用 chars ()方法迭代字符串的每个元素。