我正在将复数器移植到生锈的情况下,并且在正则表达式上遇到了一些困难。我无法像我期望的那样获得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")