我将复制器移植到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中使用。
答案 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")