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

String 如何检查字符串是否包含空格?,string,rust,String,Rust,如何检查字符串中是否包含空格 例如,这些都应返回true: “你好,世界!” “你好\n” “This\tis\ta\ttab” 您可以传递到: assert!(“你好,世界!”.contains(char::is_whitespace)); 断言!(“Hello\n”.contains(char::is_whitespace)); 断言!(“This\tis\ta\ttab”.contains(char::is_whitespace)); char::is_whitespace如果字符具有

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

例如,这些都应返回true:

  • “你好,世界!”
  • “你好\n”
  • “This\tis\ta\ttab”
您可以传递到:

assert!(“你好,世界!”.contains(char::is_whitespace));
断言!(“Hello\n”.contains(char::is_whitespace));
断言!(“This\tis\ta\ttab”.contains(char::is_whitespace));
char::is_whitespace
如果字符具有Unicode
whiteu Space
属性,则返回true

或者,如果只希望匹配ASCII空白(空格、水平制表符、换行符、换行符或回车符),则可以使用:

//这有一个非中断空格,它不是ASCII。
让string=“Hello,\u{A0}Rust!\n”;
//因此,它不是ASCII空格
断言!(!string.contains(char::is_ascii_whitespace));
//但它是Unicode空格。
断言!(string.contains(char::is_whitespace));

正如有人提到的,如果您不需要处理Unicode,它会更快 要明确命名您关心的字符,请执行以下操作:

fn main() {
   let a = vec!["false", "true space", "true newline\n", "true\ttab"];
   let a2: &[char] = &[' ', '\n', '\t'];

   for s in a.iter() {
      let b = s.contains(a2);
      println!("{}", b);
   }
}

如果只检查ASCII空格,则逐字节执行字符串可能会快得多:
string.as_bytes().iter().any(u8::is_ASCII_whitespace)
为什么会快得多?调用
.contains(…)
时使用
char
的闭包意味着迭代所有Unicode代码点,包括多字节序列,将每个多字节序列转换为
char
并调用
是ascii\u空格。很多都可以优化,确实如此,但是当你要求编译器查找有限集合中的所有字节时,它会使编译器的工作变得更容易
u8::is_ascii_whitespace
大约是char::is_ascii_whitespace
大小的四分之一(这是经过充分优化的)。当您在字节上迭代查找ascii字符时,您不必担心多字节序列,因为
0..=127
范围内的字节永远不会出现在这些字节中。因此,代码可以编写得更简单。理论上,编译器可以知道这一点,并根据该假设进行优化,但事实上它不知道。我认为这不会更快。他们的意思是,如果只查找ASCII空格,则在字节数组上调用
.contains()
可能会更快:
字符串.as_bytes().iter().any(u8::is_ASCII_whitespace)