Rust 如何在循环中调用正则表达式而不克隆数据
我正在编写一些代码来调用N个正则表达式,如果可能的话,我希望避免一直克隆字符串,因为不是每个正则表达式都是匹配的。这可能吗? 我尝试执行的代码是:Rust 如何在循环中调用正则表达式而不克隆数据,rust,borrow-checker,ownership,borrowing,Rust,Borrow Checker,Ownership,Borrowing,我正在编写一些代码来调用N个正则表达式,如果可能的话,我希望避免一直克隆字符串,因为不是每个正则表达式都是匹配的。这可能吗? 我尝试执行的代码是: 使用std::borrow::Cow; 使用regex::regex; fn main(){ let test=“abcde”; 让regexes=vec[ (Regex::new(“a”).unwrap(),“b”), (Regex::new(“b”).unwrap(),“c”), (Regex::new(“z”).unwrap(),“-”, ];
使用std::borrow::Cow;
使用regex::regex;
fn main(){
let test=“abcde”;
让regexes=vec[
(Regex::new(“a”).unwrap(),“b”),
(Regex::new(“b”).unwrap(),“c”),
(Regex::new(“z”).unwrap(),“-”,
];
让mut内容=Cow::借用(测试);
用于正则表达式中的(正则表达式,新值){
contents=regex.replace_all(&contents,new_值);
}
println!(“{}”,目录);
}
预期结果将是cccde
(如果它起作用)和两个克隆。但为了让它发挥作用,我必须在每次迭代中保持克隆:
fn main() {
let test = "abcde";
let regexes = vec![
(Regex::new("a").unwrap(), "b"),
(Regex::new("b").unwrap(), "c"),
(Regex::new("z").unwrap(), "-"),
];
let mut contents = test.to_string();
for (regex, new_value) in regexes {
contents = regex.replace_all(&contents, new_value).to_string();
}
println!("{}", contents);
}
然后输出cccde
,但有3个克隆。
有可能以某种方式避免它吗?我知道我可以调用每个正则表达式并重新绑定报税表,但我无法控制可能出现的正则表达式的数量。
提前谢谢
编辑1
对于那些想看到真实代码的人:
它正在执行O(n^2)正则表达式操作。
它从这里开始,并称之为
编辑2
以下是带有接受答案的新代码您可以在替换字符串时使用字符串作为字符串的持久所有者,并在每次迭代中检查返回的
Cow
是否为所有者。如果它是owned,则您知道替换成功,因此您将Cow
所拥有的字符串分配到循环变量中
let mut contents = test.to_owned();
for (regex, new_value) in regexes {
let new_contents = regex.replace_all(&contents, new_value);
if let Cow::Owned(new_string) = new_contents {
contents = new_string;
}
}
请注意,Rust中的赋值默认为“移动”-这意味着new\u string
的值被移动,而不是复制到内容中
给定的示例和正则表达式是简化的还是单字符替换是您想要完成的?这是否回答了您的问题?我撤回了我的投票,因为我找到了一种方法,我认为这可以不用复制。建议复制的重点是如何最简单地编码,但这个问题的重点是如何在不进行克隆的情况下进行编码,因此我猜它们之间有细微的区别。@Jason check edit 1,我将原始代码放在那里实际上,您不需要交换,使用contents=new\u string
(并且去掉mut new_string
中的mut
)也有效,因为它只是将字符串从不再需要的新内容中移出。感谢您的回答!我将对问题中指定的代码应用以下更改(选中编辑1)谢谢,HHK,我在想什么?这就是C++和生锈思维之间转换太快的原因。