正则表达式 - 无法识别的转义序列

时间:2012-04-25 15:19:55

标签: c# regex escaping

来自: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个构建错误。

  

错误&gt;无法识别的转义序列

这里有什么问题?

3 个答案:

答案 0 :(得分:6)

尝试:

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

更多细节。

@符号定义了一个逐字字符串文字。这基本上说告诉编译器引号中的字符串没有被转义。 http://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx

或者,您可以简单地将反斜杠加倍。例如:

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

但是,恕我直言,@符号更具可读性。

答案 1 :(得分:5)

您需要双重转义\个字符,使它们在字符串中是\个字面值,而不是用作字符串级别的转义序列。

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

在字符串中,其值为\{(.+?)\}

或者,您可以使用@""文字:

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

具有相同的值。


当您需要向字符串添加换行符时,可以使用转义序列"\n"。字符串文字使用\作为转义字符来帮助编码标准键盘上不存在的字符,或者难以放在字符串中。正则表达式需要使用相同的\字符来转义模式中的特殊字符。这意味着必须转义\字符才能用作字符串中的文字值,即\\

答案 2 :(得分: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"