我需要創建一個正則表達式(使用regex
包),其中包含一個作爲傳遞給程序的命令行參數傳遞的字符串。我面臨的問題是命令行參數可能包含$
和{}
。從字符串創建正則表達式
如果我硬編碼字符串爲r"..."
,那麼,它工作正常。但是,如果我用命令行參數作爲format!(r#"{}"#, arg_str)
,我得到以下錯誤(假設arg_str = ${replace}
):
線程「號召的
Err
價值Result::unwrap()
「主」恐慌:語法(「錯誤解析近\正則表達式'place}'在字符偏移量 9:不是有效的基數10數字:\'替換\'「)', src \ libcore \ result.rs:859注意:使用RUST_BACKTRACE=1
運行 回溯。
簡化代碼的例子來演示這個問題:如果這是與像replace
一個簡單的參數運行
extern crate regex;
use regex::Regex;
fn main() {
let args: Vec<_> = std::env::args().collect();
let ref arg_str = args[1];
let re = Regex::new(format!(r#"{}"#, arg_str).as_str()).unwrap();
println!("{:?}", re);
}
,沒有錯誤,但如果我通過它像${replace}
的東西,我得到的錯誤上文提到的。
我目前已經採用了「預先逃脫」的價值作爲一種訴訟,例如, '\ $ \ {replace \}' – schaazzz
值得注意的是'format!'絕對不會表現出您認爲它的樣子。 '「abc」'和'r「abc」'不是不同的東西;他們都是字符串。這只是編譯器如何在編譯時解釋其文字內容的問題。意思是'format!(「{}」,...)'和'format!(r#「{}」#,...)'做同樣的事情。值得注意的是'format!(「{}」,value)''實際上只是寫'value.to_string()'的一種冗長的方式。 –
我現在明白了...我的(不正確的)假設是它會將它轉換爲原始字符串,因爲您可以將原始字符串傳遞給正則表達式,而不必擔心字符轉義。謝謝你的解釋! – schaazzz