String 如何检查字符串是否包含空格?
如何检查字符串中是否包含空格 例如,这些都应返回true: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如果字符具有
“你好,世界!”
“你好\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
如果字符具有Unicodewhiteu 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)