将字符串解析为整数

时间:2015-05-08 18:55:12

标签: parsing rust

所以我试图在字符串中找到一个模式并将其转换为整数。

首先我找一个字符串:

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())

1 个答案:

答案 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真的可以帮助你制作明确的地方,你可以失败,你必须处理它们。 ^ _ ^

在这种情况下:

  1. 也许这个字符串没有&#34; HTTP / 1。&#34;在其中
  2. 迭代器必须在某个时刻结束,因此他们可以返回Option
  3. 将字符串解析为数字可能会失败。
  4. 这是使用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!