如何在正则表达式包中获取匹配组的索引?

时间:2015-03-18 15:47:34

标签: regex rust

我只找到一种方法是使用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());
}

有没有正确的方法?

1 个答案:

答案 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());
}