Как мне вызвать Regex::replace_all, когда средство замены использует переменную?

#regex #rust

#регулярное выражение #Ржавчина

Вопрос:

Для следующего моего кода я попытался вывести входное слово, за которым следует случайная строка. Первая функция компилируется, но я не хочу этого, потому что она не использует случайную строку. Вторая функция выдает ошибку компилятора.

Как мне это исправить?

 use regex::Regex;

fn main() {
    let cd="rust";
    ok_but_i_dont_want_it(cd);
    compiler_err(cd);
}

fn ok_but_i_dont_want_it(cd:amp;str){
    let random_str="j93bg8";
    let reg_idnt=Regex::new(r"(?P<ident>[_A-Za-z]{1,}[_A-Za-z0-9]{0,})").unwrap();
    let cd=reg_idnt.replace_all(" rust ","${ident}_{}");
    println!("{}",cd);
}

fn compiler_err(cd:amp;str){
    let random_str="j93bg8";
    let reg_idnt=Regex::new(r"(?P<ident>[_A-Za-z]{1,}[_A-Za-z0-9]{0,})").unwrap();
    let cd=reg_idnt.replace_all(cd,format!("${ident}_{}",random_str));
    println!("{}",cd);
}
 
 error: there is no argument named `ident`
  --> src/main.rs:18:47
   |
18 |      let cd=reg_idnt.replace_all(cd,format!("${ident}_{}",random_str));
   |                                               ^^^^^^^

error[E0277]: expected a `FnMut<(amp;regex::Captures<'_>,)>` closure, found `String`
 

Игровая площадка

Ответ №1:

Если вы не хотите format! обрабатывать {ident} , вы можете избежать этого, удвоив фигурные скобки:

 reg_idnt.replace_all(cd, format!("${{ident}}_{}", random_str));
 

Это приведет format! к его игнорированию, и результатом будет "{ident}_j93bg8" то, что передается replace_all .


Вам не хватает .as_str() , чтобы передать String from format! как a amp;str для удовлетворения Replacer .

 format!("${{ident}}_{}", random_str).as_str()
 

Посмотрите, как он работает на игровой площадке