使用正则表达式结果的最佳模式是什么?

What is the best pattern for working with regex results?

我是一名 Javascript 开发人员,希望通过 Rust 提升我的水平。我已阅读 Rust 编程语言,完成了教程,并使用 FFI 成功地将 Rust 添加到节点项目中。我想加快我编写的解析器的速度,但我认为我缺少基本的所有权概念。

当前的挑战很简单:评估命名捕获的正则表达式并将变量的值更改为新的捕获值。

我已经使用 unwrap 或嵌套 ResultOption 尝试了这十五种方法。它总是归结为 'does not live long enough' 错误。

我最近的代码如下所示:

let flag_re = compile_re(r"(?:\s*)([~])(?:\s*)(?P<FLAG>.)"); 

let mut flag : &str = "V";

for line in file.lines() {

    let mut current_line : String = line.unwrap();

    if flag_re.is_match(&current_line) {

        let new_flag = &flag_re.captures(&current_line).unwrap().name("FLAG").unwrap().clone();

        println!("old flag: {} new flag: {}",flag,new_flag);

        flag = new_flag;

    }

如果我注释掉 flag = new_flag 行,效果会很好。但是一旦我尝试为 flag 赋值,我就会在 current_line 变量上得到一个 'does not live long enough'。我知道 current_line 是短暂的,所以我尝试了 cloneto_owned 但没有成功,这让我确信我对这些概念有一些误解。

我尝试使用以下代码在 Rust 游乐场中重新创建它:

fn main() {
   let mut a: &str;
   {
     let b: &str = "B";
     a = b;  
   }
   println!("a: {} ",a);
}

但是(你不知道)这行得通吗?所以请对这个 Javascript 人温柔一点。

问题是new_flag是从line借来的。也就是说,只要line继续存在,new_flag只能存在。一旦跳出循环,line就会被销毁

处理此问题的最简单方法是从借用的字符串 (&str) 切换到 拥有的 字符串 (String)。也就是说,您需要一个拥有其内容的值,这样就不会发生借用。适当的更改是:

let mut flag = String::from("V"); // One way of constructing a String from a &str
...
    flag = new_flag.into(); // Another way, using inference

稍微 更有效的替代方法是使用 std::borrow::Cow,但在这种情况下可能没有必要。