Regex 如何使用正则表达式捕获组中的格式化字符串执行替换?
我使用regex板条箱一次进行多个更换:Regex 如何使用正则表达式捕获组中的格式化字符串执行替换?,regex,rust,Regex,Rust,我使用regex板条箱一次进行多个更换: extern crate regex; use regex::{Captures, Regex}; fn transform(string: &str) { let rgx = Regex::new(r"(\n)|(/\w+)").unwrap(); let res = rgx.replace_all(string, |caps: &Captures| { if caps.get(1).is_some(
extern crate regex;
use regex::{Captures, Regex};
fn transform(string: &str) {
let rgx = Regex::new(r"(\n)|(/\w+)").unwrap();
let res = rgx.replace_all(string, |caps: &Captures| {
if caps.get(1).is_some() {
return " ";
}
match caps.get(2).map(|m: regex::Match| m.as_str()) {
Some(z) => return "nope", // how to return formatted z instead?
None => (),
}
unreachable!();
});
println!("{}", res);
}
fn main() {
transform("no errors");
transform("big\nbad\n/string");
}
按预期产出:
no errors
big bad nope
我想返回以某种方式格式化的z
,而不是“nope”<代码>格式由于String
/生命周期问题,code>似乎无法在此处使用:
match caps.get(2).map(|m: regex::Match| m.as_str()) {
Some(z) => return format!("cmd: {}", z),
None => (),
}
错误[E0308]:类型不匹配
-->src/main.rs:12:31
|
12 | Some(z)=>返回格式!(“cmd:{}”,z),
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型“%str”`
找到类型“std::string::string”`
=注意:此错误源于当前板条箱外部的宏(在夜间构建中,使用-Z外部宏反向跟踪运行以获取更多信息)
应该怎么做?在错误消息中注意: 应为
&str
它需要一个&str
,因为这是闭包返回的第一个类型:
一个闭包/函数只能有一个返回类型,不能有两个
最简单的修复方法是在两种情况下都返回字符串
:
let res = rgx.replace_all(string, |caps: &Captures| {
if caps.get(1).is_some() {
return String::from(" ");
}
let m = caps.get(2).unwrap();
format!("cmd: {}", m.as_str())
});
为了提高效率,可以避免为空格字符分配字符串
:
use std::borrow::Cow;
我还将匹配
替换为=>()
手臂与不可访问的配对用较短的展开
另见:
String
没有生命周期,所以它只能工作。您尝试时出现了哪些错误?请注意我是如何编辑您的问题以显示您尝试的代码,以及在整个错误消息中复制的。请注意以类似的方式为将来的所有问题提供信息,因为这是一种非常有效的沟通方式。
use std::borrow::Cow;
let res = rgx.replace_all(string, |caps: &Captures| {
if caps.get(1).is_some() {
return Cow::from(" ");
}
let m = caps.get(2).unwrap();
Cow::from(format!("cmd: {}", m.as_str()))
});