Regex 如何获取正则表达式板条箱中匹配组的索引?
我只发现一种方法是使用iter来检查哪个索引是某个(..)Regex 如何获取正则表达式板条箱中匹配组的索引?,regex,rust,Regex,Rust,我只发现一种方法是使用iter来检查哪个索引是某个(..) let re=Regex::new(r)([a-zA-Z][a-zA-Z0-9]*)|([0-9]+)|(\)|(\)|(=))展开(); 关于iter的cap(“asdf.aeg=34”){ 设mut指数=0; 对于cap.iter().enumerate()中的(i,name){ 如果i==0{继续} 如果让某些(41;)=名称{index=i;break;} } println!(“组{:?},匹配{:?}”,索引,cap.at(
let re=Regex::new(r)([a-zA-Z][a-zA-Z0-9]*)|([0-9]+)|(\)|(\)|(=))展开();
关于iter的cap(“asdf.aeg=34”){
设mut指数=0;
对于cap.iter().enumerate()中的(i,name){
如果i==0{继续}
如果让某些(41;)=名称{index=i;break;}
}
println!(“组{:?},匹配{:?}”,索引,cap.at(index.unwrap());
}
有合适的方法吗?我认为您的代码几乎是尽可能接近的。下面是一个更为惯用的版本:
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());
}
但是“查找第一个
Some
”步骤在最坏的情况下仍然需要O(n)个时间来获取索引。有没有办法在O(1)时间内得到索引?为什么正则表达式在匹配组时不记得索引,然后返回给用户?我不知道为什么正则表达式API没有这样的功能。我的猜测是,除非你的正则表达式包含数千个组,否则我认为这并不重要。您始终可以向正则表达式提交功能请求。是的,请提交问题。请解释一下你要解决的问题。(我在这个问题的任何地方都没有看到描述。)(请注意,我已经修改了代码,以处理除整个正则表达式外没有组匹配的情况(如果匹配的替代项没有组,则可能发生这种情况))