提问人:Patrik Holub 提问时间:10/30/2023 最后编辑:cafce25Patrik Holub 更新时间:10/31/2023 访问量:87
多次遍历一个字符串,同时替换该字符串的某些部分
Going through a string multiple times while replacing parts of that string
问:
我有看起来像这样的字符串.删除了空格字符。
现在我需要找到所有可解决的部分并用其他东西替换它们。(我选择了,每次替换的增量)"((a<=b)||(c&&(d==a))"
"[i]"
i
因此,我希望字符串会像这样变化,⇒ ⇒ ⇒我还需要捕获各个部分。到目前为止,我已经编写了这个函数,并使用正则表达式EXPR_RE来查找和捕获:"((a<=b)||(c&&(d==a))"
"([0]||(c&&[1]))"
"([0]||[2])"
"[3]"
fn my_replace(in_str: &str) -> ([&str; 64], [[&str; 2]; 64]) {
let mut operators: [&str; 64] = [""; 64];
let mut operands: [[&str; 2]; 64] = [[""; 2]; 64];
lazy_static! {
static ref EXPR_RE: Regex =
Regex::new(r"(\[?[A-Za-z0-9]+\]?)(==|&&|\|\||<=|!)(\[?[A-Za-z0-9]+\]?)").unwrap();
}
let mut i: usize = 0;
let mut repl_line: String = in_str.to_string();
loop {
match EXPR_RE.is_match(&repl_line) {
true => {
for (_, [var_left, operand, var_right]) in
EXPR_RE.captures_iter(&repl_line).map(|c| c.extract())
{
operands[i] = [var_left, var_right];
operators[i] = operand;
let orig_str = format!("({}{}{})", var_left, operand, var_right);
let repl_str = format!("[{}]", i);
repl_line = repl_line.replace(&orig_str, &repl_str);
i += 1;
}
}
false => {
break;
}
}
}
return (operators, operands);
}
问题是,在进行分配和替换的 内部,它不会让我分配,因为它是在 中借来的。我不知道如何绕过它或修复它。for
repl_line
EXPR_RE.captures_iter(&repl_line)
我知道一次传递有效,因为当我测试正则表达式并在不多次遍历字符串的情况下替换时,它可以正常工作并正确替换。代码如下所示:
fn _temp(in_str: &str) -> String {
let mut operators: [&str; 64] = [""; 64];
let mut operands: [[&str; 2]; 64] = [[""; 2]; 64];
lazy_static! {
static ref EXPR_RE: Regex =
Regex::new(r"(\[?[A-Za-z0-9]+\]?)(==|&&|\|\||<=|!)(\[?[A-Za-z0-9]+\]?)").unwrap();
}
let mut i: usize = 0;
let mut repl_line: String = in_str.to_string();
for (_, [var_left, operand, var_right]) in EXPR_RE.captures_iter(in_str).map(|c| c.extract()) {
operands[i] = [var_left, var_right];
operators[i] = operand;
let orig_str = format!("({}{}{})", var_left, operand, var_right);
let repl_str = format!("[{}]", i);
repl_line = repl_line.replace(&orig_str, &repl_str);
i += 1;
}
return repl_line;
}
这已经正确完成了第一步,但我不知道如何使更完整的功能工作。任何帮助将不胜感激。rec_replace
答: 暂无答案
评论
repl_line
String
String
String
repl_line
replace_all
使用 as 和 using 而不是 for both 和 .FnMut
Replacer
String
&str
operators
operands
(a<=b)
[0]
([0])
((some)(some)(some))