在当前范围内没有为`regex :: re :: Regex`类型找到名为`unwrap`的方法

时间:2015-11-15 23:53:44

标签: regex rust

我正在尝试在Rust中查找正则表达式的所有匹配范围,并找到了一个非常有前途的方法in the docs。这是我找到的示例用法

let text = "Retroactively relinquishing remunerations is reprehensible.";
for pos in Regex::new(r"\b\w{13}\b").unwrap().find_iter(text) {
    println!("{:?}", pos);
}

// Output:
// (0, 13)
// (14, 27)
// (28, 41)
// (45, 58)

我试图在库中的任意正则表达式上模拟这种行为。这是我的代码。

  

Cargo.toml(相关部分)

[dependencies]
regex = "0.1"
  

lib.rs

extern crate regex;
pub mod tokenize;
  

标记化/ mod.rs

extern crate regex;
pub mod util;
  

标记化/ util.rs

extern crate regex;
use regex::Regex;

pub fn regexp_span_tokenize(s: &str, regexp: regex::Regex) -> Vec<(i32, i32)> {
    return regexp.unwrap().find_iter(s);
}

当我发出cargo build时,我收到以下错误:

tokenize/util.rs:38:19: 38:27 error: no method named `unwrap` found for type `regex::re::Regex` in the current scope
tokenize/util.rs:38     return regexp.unwrap().find_iter(s);
                                      ^~~~~~~~
error: aborting due to previous error

为什么我收到此编译错误?

2 个答案:

答案 0 :(得分:6)

您收到此错误的原因是,regex::re::Regex没有实现名为unwrap的方法; - )

在示例

的行中

for pos in Regex::new(r"\b\w{13}\b").unwrap().find_iter(text) {

unwrap类型的值调用

Result<Regex, Error>,这是Regex::new returns。但是在您的代码中,您在unwrap类型的值上调用了Regex

答案 1 :(得分:4)

所有匹配操作都在Regex类型本身,例如find_iter,因此您可以直接致电:regexp.find_iter(s);

第一种情况需要unwrap因为Regex::new(...) returns a Result,也就是说,它可能会失败(如果Regex无效)。如果您已经使用普通Regex,则不需要unwrap