#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()
Посмотрите, как он работает на игровой площадке