Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何获取正则表达式板条箱中匹配组的索引?_Regex_Rust - Fatal编程技术网

Regex 如何获取正则表达式板条箱中匹配组的索引?

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(

我只发现一种方法是使用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(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没有这样的功能。我的猜测是,除非你的正则表达式包含数千个组,否则我认为这并不重要。您始终可以向正则表达式提交功能请求。是的,请提交问题。请解释一下你要解决的问题。(我在这个问题的任何地方都没有看到描述。)(请注意,我已经修改了代码,以处理除整个正则表达式外没有组匹配的情况(如果匹配的替代项没有组,则可能发生这种情况))