2017-05-26 3 views
1

プログラムに渡されるコマンドライン引数として渡される文字列を含む正規表現(regexを使用)を作成する必要があります。私が直面している問題は、コマンドライン引数に${}を含めることができるということです。文字列からRegexを作成する

文字列をr"..."とハードコードすると問題なく動作します。

スレッドのメイン '「Err 値にResult::unwrap()と呼ばでパニック::私はformat!(r#"{}"#, arg_str)として、コマンドライン引数を使用している場合しかし、私は(arg_str = ${replace}と仮定して)、次のエラーを取得する構文を\近い(「解析エラーの正規表現'place} \'を文字オフセットで入力してください 9:有効ではありません10番号:\ '置換\' ") ' src \ libcore \ result.rs:859注: バックトレースの場合はRUST_BACKTRACE=1で実行してください。

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}のようなものを渡すと、私はエラーを取得する:この問題を実証するコード例を簡素化

上記の通り。

+0

私は、現在、 "pre-escaped"値をarugmentとして渡すことに訴えています。 '\ $ \ {replace \}' – schaazzz

+3

'format!'は、あなたの考え方を絶対に振る舞いません。 '' abc ''と' 'abc" 'は異なる種類のものではありません。彼らは両方の文字列です。これは、コンパイル時にコンパイラがリテラル内容をどのように解釈するかという単なる問題です。 'format!(" {} "、...)'と 'format!(r#" {} "#、...)は同じことを意味します。 'format!(" {} "、value)'は、実際には 'value.to_string()'を書くだけの長年の方法です。 –

+0

私は今理解しています...私の(間​​違った)仮定は、生の文字列をRegexに渡すことができ、エスケープ文字について心配しないので、それを生の文字列に変換するということでした。ご説明ありがとうございます! – schaazzz

答えて

4

正規表現の木箱には、必要な機能を果たす関数escapeがあります。 documentationから

機能regex::escape

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

エスケープtext内のすべての正規表現のメタ文字。
返される文字列は、正規表現のリテラルとして安全に使用できます。

arg_strからregex::escapeを渡すと問題が解決するはずです。

+0

はい、そのトリックでした。ありがとう! – schaazzz

関連する問題