我正在尝试在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
为什么我收到此编译错误?
答案 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
。