我只找到一种方法是使用Captures iter来检查哪个索引是某些(..)。
let re = Regex::new(r"([a-zA-Z_][a-zA-Z0-9]*)|([0-9]+)|(\.)|(=)").unwrap();
for cap in re.captures_iter("asdf.aeg = 34") {
let mut index = 0;
for (i, name) in cap.iter().enumerate() {
if i == 0 {continue}
if let Some(_) = name {index = i; break;}
}
println!("group {:?}, match {:?}", index, cap.at(index).unwrap());
}
有没有正确的方法?
答案 0 :(得分:3)
我认为你的代码几乎和你能得到的一样接近。这是一个稍微更惯用的版本:
let re = Regex::new(r"([a-zA-Z_][a-zA-Z0-9]*)|([0-9]+)|(\.)|(=)").unwrap();
for cap in re.captures_iter("asdf.aeg = 34") {
let index = cap.iter().enumerate()
.skip(1) // skip the first group
.find(|t| t.1.is_some()) // find the first `Some`
.map(|t| t.0) // extract the index
.unwrap_or(0); // get the index
println!("group {:?}, match {:?}", index, cap.at(index).unwrap());
}