プログラムに渡されるコマンドライン引数として渡される文字列を含む正規表現(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}
のようなものを渡すと、私はエラーを取得する:この問題を実証するコード例を簡素化
上記の通り。
私は、現在、 "pre-escaped"値をarugmentとして渡すことに訴えています。 '\ $ \ {replace \}' – schaazzz
'format!'は、あなたの考え方を絶対に振る舞いません。 '' abc ''と' 'abc" 'は異なる種類のものではありません。彼らは両方の文字列です。これは、コンパイル時にコンパイラがリテラル内容をどのように解釈するかという単なる問題です。 'format!(" {} "、...)'と 'format!(r#" {} "#、...)は同じことを意味します。 'format!(" {} "、value)'は、実際には 'value.to_string()'を書くだけの長年の方法です。 –
私は今理解しています...私の(間違った)仮定は、生の文字列をRegexに渡すことができ、エスケープ文字について心配しないので、それを生の文字列に変換するということでした。ご説明ありがとうございます! – schaazzz