2012-04-25 8 views
0

認識できないエスケープシーケンス:私が使用しようとしていますhttps://stackoverflow.com/a/959982/101055正規表現 - から

using System.Text.RegularExpressions; 

Dictionary<string, string> parameters = new Dictionary<string, string>(); 
parameters.Add("goodName1", "asdf"); 
parameters.Add("goodName2", "qwerty"); 
string text = "this is my {goodName1} template {goodName2} string"; 
text = Regex.Replace(text, "\{(.+?)\}", m => parameters[m.Groups[1].Value]); 

は、私は正確に{}に、\{(.+?)\}に2ビルドエラーを取得します。

ERROR>認識できないエスケープシーケンス

ここで何が悪いのでしょうか?

+0

私がしようとするので、ここに掲載、元のスレッドが、無回答で尋ねた - それは大丈夫です願っています。 – b0x0rz

+0

また、このエラーを修正するためにオリジナル(上のリンク)を編集しました。 – b0x0rz

+0

可能な重複[バックスラッシュを含むパス文字列の認識されないエスケープシーケンス](http://stackoverflow.com/questions/1302864/unrecognized-escape-sequence-for-path-string-containing-backslashes) – JasonMArcher

答えて

6

試してみてください。

text = Regex.Replace(text, @"\{(.+?)\}", m => parameters[m.Groups[1].Value]); 

いくつかの詳細。

@記号は、逐語文字列リテラルを定義します。これは、基本的にコンパイラに、引用符で囲まれた文字列がエスケープされていないことを伝えます。 http://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx

オプションで、バックスラッシュを2倍にすることもできます。例:

text = Regex.Replace(text, "\\{(.+?)\\}", m => parameters[m.Groups[1].Value]); 

しかし、IMHOの@記号ははるかに読みやすくなります。

+0

* thnx *が動作しました。それが私に許されるとすぐに答えを受け入れるでしょう(12分)。 – b0x0rz

+1

@ b0x0rz:文字列がエスケープされないことを意味する "逐語的文字列リテラル"を定義します。さらに詳しい情報は:http://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx – NotMe

5

あなたは、彼らが文字列内のリテラル\だし、文字列レベルのエスケープシーケンスとして使用しないように、あなたの\文字をエスケープ倍にする必要があります。同一の値を持つ

@"\{(.+?)\}" 

:文字列内の

"\\{(.+?)\\}" 

が、これはまた、あなたが@""リテラルを使用することができます\{(.+?)\}

の値を持っています。


あなたは文字列に改行を追加する必要がある場合、あなたはエスケープシーケンス、"\n"を使用しています。文字列リテラルは、\をエスケープ文字として使用し、標準キーボードには存在しない文字や、文字列内に配置することが困難な文字のコーディングを支援します。正規表現では、パターン内の特殊文字をエスケープするには、同じ\文字を使用する必要があります。つまり、\文字は、文字列のリテラル値として使用するためにエスケープする必要があります(\\)。

1

@を追加して文字列全体をエスケープしたり、ダブルスラッシュ(\\)を使用してそれぞれのエスケープをエスケープすることができます。

Here is a good article on strings and escaping them from MSDN

記事からの例:

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt" 
+0

リンクのthnx :) – b0x0rz