2017-05-26 71 views
1

我需要創建一個正則表達式(使用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}的東西,我得到的錯誤上文提到的。

+0

我目前已經採用了「預先逃脫」的價值作爲一種訴訟,例如, '\ $ \ {replace \}' – schaazzz

+3

值得注意的是'format!'絕對不會表現出您認爲它的樣子。 '「abc」'和'r「abc」'不是不同的東西;他們都是字符串。這只是編譯器如何在編譯時解釋其文字內容的問題。意思是'format!(「{}」,...)'和'format!(r#「{}」#,...)'做同樣的事情。值得注意的是'format!(「{}」,value)''實際上只是寫'value.to_string()'的一種冗長的方式。 –

+0

我現在明白了...我的(不正確的)假設是它會將它轉換爲原始字符串,因爲您可以將原始字符串傳遞給正則表達式,而不必擔心字符轉義。謝謝你的解釋! – schaazzz

回答

4

正則表達式箱子有一個函數escape,它可以滿足你的需要。

documentation

功能regex::escape

pub fn escape(text: &str) -> String 

轉義text所有正則表達式元字符。
返回的字符串可以安全地用作正則表達式中的文字。

因此,通過您的arg_strregex::escape應該可以解決您的問題。

+0

是的,這是訣竅。謝謝! – schaazzz