字符串
Rust的原生String
类型,并不等价于Vec<u8>
,而必须是合法的UTF-8串。如果不和外部交互,这几乎不会带来什么问题。但是如何要和C语言交互、和操作系统交互,就麻烦了。所以有很多meme调侃这一点。类型作为约束数据的规范,正是因为有这么多不统一的规范才有这么多不统一的类型。纵然很多时候不同的字符串规范只有细微的差距,但是为了程序的安全,考虑差距是必要的。
[!Note]
UTF-8串中,一个字符占的字节数是不固定的。所以对String
进行索引操作的复杂度是O(n)。
String
几乎所有的编程语言都拥有字符串类型,也都会提供诸如查找、大小写转换等功能。Rust的标准库文档做的很好,此处不做复制粘贴,可以参考std::string::String
。
值得一提的事&str
和String
的区别。
String
是一个可增长、可变、拥有所有权的 UTF-8 字符串类型。它在堆上分配内存,这意味着它可以在运行时扩展或缩减。&str
通常称为字符串切片(string slice),是一个指向有效 UTF-8 序列的不可变引用。它通常指向字符串数据的一部分,这些数据本身可以存储在任何地方,如在另一个字符串、常量数据区或String
中。&str
本身并不拥有它指向的数据。- 所以,从
&str
到String
的转换需要进行内存分配,通常通过to_string()
或String::from()
实现,而将String
转换成&str
则基本没有开销。
类似于Python的format string,Rust有format!
宏可以完成类似的工作。占位符也是{}
let name = "Alice";
let age = 30;
let sentence = format!("My name is {} and I am {} years old.", name, age);
println!("{}", sentence);
Regex
Rust并没有将正则表达式放进标准库,而是由第三方库regex
实现。
use regex::Regex;
fn main() {
let re = Regex::new(r"(\w+)-(\d+)").unwrap();
let text = "Example-1234";
match re.captures(text) {
Some(caps) => {
println!("Matched: {} {}", &caps[1], &caps[2]);
}
None => println!("No match found"),
}
}
Serde
Serde 是序列化和反序列化的“标准框架”。