【发布时间】:2015-08-14 16:02:14
【问题描述】:
我正在使用此正则表达式处理格式为“1s:1d”、“100:5000”等的简单字符串:
let retention_matcher = regex::Regex::new({r"^(\d+)([smhdy])?:(\d+)([smhdy])?$"}).unwrap();
我知道这个正则表达式应该只匹配一次,所以我想运行正则表达式进行捕获并检查捕获的数量。
let iter = retention_matcher.captures_iter(ts);
let count = iter.count();
println!("iter.count(): {}", count);
let _ : Vec<Option<(u64,u64)>> = iter.map(|regex_match| {
let retval = retention_spec_to_pair(regex_match);
println!("precision_opt: {:?}", retval);
retval
}).collect();
问题是count() 方法移动了iter,我不能再使用它了。
src/bin/whisper.rs:147:42: 147:46 error: use of moved value: `iter`
src/bin/whisper.rs:147 let _ : Vec<Option<(u64,u64)>> = iter.map(|regex_match| {
^~~~
src/bin/whisper.rs:144:21: 144:25 note: `iter` moved here because it has type `regex::re::FindCaptures<'_, '_>`, which is non-copyable
src/bin/whisper.rs:144 let count = iter.count();
这对我来说没有意义。 count 方法是否应该只返回一个可复制的usize 值而不移动iter?我该如何解决这个问题?
【问题讨论】:
-
如果您只需要一组捕获,请使用
retention_matcher.captures(ts)。它的合同似乎与您的用例完全匹配。 (实际上,您的正则表达式是完全锚定的,因此它只能为特定字符串生成一个匹配项。)无需使用迭代器。 :-)
标签: regex iterator rust borrow-checker