无法获得`regex :: replace()`替换编号的捕获组



我正在将复数器移植到生锈的情况下,并且在正则表达式上遇到了一些困难。我无法像我期望的那样获得Regex::replace()方法来替换编号的捕获组。例如,以下显示一个空字符串:

let re = Regex::new("(m|l)ouse").unwrap();
println!("{}", re.replace("mouse", "$1ice"));

我希望它能像在JavaScript(或Swift,Python,C#或GO(

一样打印"鼠标"
var re = RegExp("(m|l)ouse")
console.log("mouse".replace(re, "$1ice"))

我应该使用一些方法而不是Regex::replace()吗?

检查燃气箱,我发现它提取了第一个捕获组,然后将后缀附加到捕获的文本上:

if let Some(c) = rule.captures(&non_plural_string) {
    if let Some(c) = c.get(1) {
        return format!("{}{}", c.as_str(), replace);
    }
}

但是,鉴于replace在我使用的其他所有语言中都可以使用正则表达式,我希望它也可以在Rust中起作用。

文档中提到的:

使用了最长的名称。例如,$1a查找名为1a的捕获组,而不是索引1处的捕获组。要对名称进行更精确的控制,请使用括号,例如${1}a

有时替换字符串需要使用卷曲括号 描述一个捕获组的替换和周围的文字。 例如,如果我们想和一个单词一起加入 下划线:

let re = Regex::new(r"(?P<first>w+)s+(?P<second>w+)").unwrap();
let result = re.replace("deep fried", "${first}_$second");
assert_eq!(result, "deep_fried");

没有卷发括号,将使用捕获组名称first_, 而且由于它不存在,它将被空的 字符串。

您想要re.replace("mouse", "${1}ice")

最新更新