【问题标题】:Cannot get `Regex::replace()` to replace a numbered capture group无法获取 `Regex::replace()` 来替换编号的捕获组
【发布时间】:2017-06-02 15:50:06
【问题描述】:

我正在将复数词移植到 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 中使用。

【问题讨论】:

    标签: regex rust


    【解决方案1】:

    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")

    【讨论】:

    • 我不敢相信我错过了。我一定读过那部分20遍。这完美!谢谢!
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2019-10-08
    相关资源
    最近更新 更多