Rust中如何用变量替换正则匹配的内容?
Rust正则替换中使用变量作为替换内容的方法
你遇到的问题是因为regex库的$语法是用来引用正则捕获组的,不是直接引用Rust变量,所以$foo会被解析为名为foo的捕获组(不存在的话就会保留原字符串),自然达不到替换成变量的效果。这里提供两种可行的实现方式:
方法一:用format!预构造替换模板
先通过format!把捕获组占位符和变量拼接成合法的替换字符串,再传入replace_all:
fn replace_with(foo: &str) -> String { use regex::Regex; let before = "Hello, World"; let re = Regex::new(r"(.*?)(World)").unwrap(); // 预构造包含捕获组和变量的替换模板 let replacement = format!("$1 {}", foo); String::from(re.replace_all(before, replacement.as_str())) }
方法二:使用闭包作为替换逻辑
replace_all支持接收闭包作为替换参数,闭包可以访问外部变量foo,还能灵活处理捕获到的内容:
fn replace_with(foo: &str) -> String { use regex::Regex; let before = "Hello, World"; let re = Regex::new(r"(.*?)(World)").unwrap(); // 闭包中获取捕获组内容并和变量拼接 re.replace_all(before, |caps: ®ex::Captures| { format!("{} {}", caps.get(1).unwrap().as_str(), foo) }).to_string() }
两种方法都能实现把匹配到的"World"替换为变量foo的内容,第一种适合简单场景,第二种更适合需要对捕获内容做额外处理的复杂情况。
内容的提问来源于stack exchange,提问作者zv777mnw
相关产品推荐
相关产品推荐

