Regex 如何使用正则表达式捕获组中的格式化字符串执行替换?

Regex 如何使用正则表达式捕获组中的格式化字符串执行替换?,regex,rust,Regex,Rust,我使用regex板条箱一次进行多个更换: extern crate regex; use regex::{Captures, Regex}; fn transform(string: &str) { let rgx = Regex::new(r"(\n)|(/\w+)").unwrap(); let res = rgx.replace_all(string, |caps: &Captures| { if caps.get(1).is_some(

我使用regex板条箱一次进行多个更换:

extern crate regex;

use regex::{Captures, Regex};

fn transform(string: &str) {
    let rgx = Regex::new(r"(\n)|(/\w+)").unwrap();
    let res = rgx.replace_all(string, |caps: &Captures| {
        if caps.get(1).is_some() {
            return " ";
        }
        match caps.get(2).map(|m: regex::Match| m.as_str()) {
            Some(z) => return "nope", // how to return formatted z instead?
            None => (),
        }
        unreachable!();
    });
    println!("{}", res);
}

fn main() {
    transform("no errors");
    transform("big\nbad\n/string");
}
按预期产出:

no errors
big bad nope
我想返回以某种方式格式化的
z
,而不是“nope”<代码>格式String/生命周期问题,code>似乎无法在此处使用:

match caps.get(2).map(|m: regex::Match| m.as_str()) {
    Some(z) => return format!("cmd: {}", z),
    None => (),
}
错误[E0308]:类型不匹配
-->src/main.rs:12:31
|
12 | Some(z)=>返回格式!(“cmd:{}”,z),
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型“%str”`
找到类型“std::string::string”`
=注意:此错误源于当前板条箱外部的宏(在夜间构建中,使用-Z外部宏反向跟踪运行以获取更多信息)

应该怎么做?

在错误消息中注意:

应为
&str

它需要一个
&str
,因为这是闭包返回的第一个类型:

一个闭包/函数只能有一个返回类型,不能有两个

最简单的修复方法是在两种情况下都返回
字符串

let res = rgx.replace_all(string, |caps: &Captures| {
    if caps.get(1).is_some() {
        return String::from(" ");
    }
    let m = caps.get(2).unwrap();
    format!("cmd: {}", m.as_str())
});
为了提高效率,可以避免为空格字符分配
字符串

use std::borrow::Cow;

我还将
匹配
替换为
=>()
手臂与
不可访问的配对展开

另见:


    • String
      没有生命周期,所以它只能工作。您尝试时出现了哪些错误?请注意我是如何编辑您的问题以显示您尝试的代码,以及在整个错误消息中复制的。请注意以类似的方式为将来的所有问题提供信息,因为这是一种非常有效的沟通方式。
      use std::borrow::Cow;
      
      let res = rgx.replace_all(string, |caps: &Captures| {
          if caps.get(1).is_some() {
              return Cow::from(" ");
          }
          let m = caps.get(2).unwrap();
          Cow::from(format!("cmd: {}", m.as_str()))
      });