所以我试图在字符串中找到一个模式并将其转换为整数。
首先我找一个字符串:
let haystack = "HTTP/1.1 200\r\n";
let needle = "HTTP/1.";
let http_location = haystack.rfind(needle);
if (http_location.is_some()) {
既然我已经找到它,我可以想出两种方法来获得数字状态。之一:
let mut temp_str = haystack.char_at(http_location.unwrap());
let status = String::from_str(temp_str);
}
或者:
let status = String::from_str(&haystack[http_location.unwrap()]);
}
不幸的是,他们都被弃用了(反正可能是错的)。目前正确的做法是什么?
此外,这部分在风格上是否正确?:
let http_location = haystack.rfind(needle);
if (http_location.is_some())
答案 0 :(得分:4)
解析是一个广泛而多变的话题。有简单的解析工具,并且有高效的解析工具和介于两者之间的频谱。
fn main() {
let haystack = "HTTP/1.1 200\r\n";
let needle = "HTTP/1.";
let z: Option<u8> = haystack.rfind(needle).and_then(|pt| {
let after_match = &haystack[(pt + needle.len())..];
after_match.splitn(2, " ").next()
}).and_then(|val| {
val.parse().ok()
});
println!("{:?}", z)
}
在这里,我们像以前一样使用rfind
,这可能会失败。如果结果为and_then
,我们使用Some
来运行闭包。第一个闭包在针之后切割字符串,然后在空格上将其分割,最多为2个部分。这可能会失败,因此我们使用第二个and_then
来使用parse
, 也可以Result
失败,因此我们将其转换为{{1}保留类型。
结束时,我们仍然可能失败了,因为我们解析的东西可能不是一个可解析的数字!
Rust真的可以帮助你制作明确的地方,你可以失败,你必须处理它们。 ^ _ ^
在这种情况下:
Option
。这是使用regex crate的替代解决方案:
None
你会发现我们有相同类型的失败模式,但结构有点不同。
或者使用extern crate regex;
use regex::Regex;
fn main() {
let haystack = "HTTP/1.1 200\r\n";
let re = Regex::new(r"HTTP/1.(\d) (\d+)\r\n").unwrap();
let captures = re.captures(haystack).unwrap();
let version: Option<u8> = captures.at(1).and_then(|version| version.parse().ok());
let status: Option<u8> = captures.at(2).and_then(|version| version.parse().ok());
assert_eq!(Some(1), version);
assert_eq!(Some(200), status);
println!("Version: {:?}, Status: {:?}", version, status);
}
和Result
的版本:
try!