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

时间:2017-06-02 15:50:06

标签: regex rust

我将复制器移植到Rust,我对正则表达式有些困难。我无法像我期望的那样获得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()吗?

检查Inflector crate,我看到它提取了第一个捕获组,然后将后缀附加到捕获的文本中:

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

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

1 个答案:

答案 0 :(得分:6)

the documentation中所述:

  

使用最长的名称。例如,$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")