如何检查字符串是否包含空格?

Cam*_*lid 43 string rust

如何在 Rust 中检查字符串是否包含任何空格?

例如,这些都应该返回 true:

  • "Hello, world!"
  • "Hello\n"
  • "This\tis\ta\ttab"

Cam*_*lid 59

您可以传递char::is_whitespace.contains()

assert!("Hello, world!".contains(char::is_whitespace));
assert!("Hello\n".contains(char::is_whitespace));
assert!("This\tis\ta\ttab".contains(char::is_whitespace));
Run Code Online (Sandbox Code Playgroud)

char::is_whitespace如果字符具有 UnicodeWhite_Space属性,则返回 true 。

或者,char::is_ascii_whitespace如果您只想匹配 ASCII 空格(空格、水平制表符、换行符、换页或回车),您可以使用:

// This has a non-breaking space, which is not ASCII.
let string = "Hello,\u{A0}Rust!\n";

// Thus, it's *not* ASCII whitespace
assert!(!string.contains(char::is_ascii_whitespace));
// but it *is* Unicode whitespace.
assert!(string.contains(char::is_whitespace));
Run Code Online (Sandbox Code Playgroud)

  • 使用采用“char”的闭包调用“.contains(...)”意味着迭代所有 Unicode 代码点,包括多字节代码点,将每个多字节序列转换为“char”并对其调用“is_ascii_whitespace” 。其中很多都可以优化掉,确实如此,但是当您只要求编译器查找属于有限集合之一的所有字节时,它会让编译器变得更容易。[可以对比生成的汇编代码](https://rust.godbolt.org/z/Gaa6GK);`u8::is_ascii_whitespace` 大约是 `char::is_ascii_whitespace` 大小的四分之一(经过全面优化)。 (19认同)
  • 如果您只检查 ASCII 空格,则逐字节检查可能会更快:“string.as_bytes().iter().any(u8::is_ascii_whitespace)” (18认同)
  • 为什么会明显更快? (2认同)
  • 当您迭代字节查找 ASCII 字符时,您不必担心多字节序列,因为“0..=127”范围内的字节永远不会出现在其中。这样代码就可以写得更简单。理论上,编译器可以知道这一点并根据该假设进行优化,但实际上却不然。 (2认同)