如何在运行时值中使用.NET样式的转义序列?

时间:2011-06-16 21:13:04

标签: c# escaping

当我在XML配置文件中编写分隔符值时出现此问题,通常当您在XML配置中编写类似"\t"的字符串时,像XDocument这样的解析器类会自动将其转换为{ {1}}以便从配置中解析的字符串中获得反斜杠和@"\\t"。但是,我想要的只是一个制表符而不是一个双字符串。

所以问题变成:给定一个包含转义序列的字符串,如't',如何将其转换为单字符选项卡?

2 个答案:

答案 0 :(得分:4)

如何删除@前缀?

Verbatim和普通字符串文字是在源代码中编写字符串的方法。在运行时,它们之间没有区别。然后他们只是简单的字符串。

如果要在运行时处理转义序列,可以执行以下操作:

string ReplaceEscapeSequences(string s)
{
  Contract.Requires(s != null);
  Contract.Ensures(Contract.Result<string>() != null);

  StringBuilder sb = new StringBuilder();
  for(int i = 0; i < s.Length; i++)
  {
    if(s[i] == '\\')
    {
      i++;
      if(i == s.Length)
        throw new ArgumentException("Escape sequence starting at end of string", s);
      switch(s[i])
      {
        case '\\':
          sb.Append('\\');
          break;
        case 't':
          sb.Append('\t');
          break;
        ...
      }
    }
    else sb.Append(s[i]);
  }
  return sb.ToString();
}

答案 1 :(得分:2)

您可以这样做:

stringValue = stringValue.Replace("\\t", "\t");

我编写了以下方法来替换一堆常见的转义字符序列。

    public static string LiteralValue(this string value)
    {
        return value
            .Replace("\\\\", "\\")
            .Replace("\\a", "\a")
            .Replace("\\b", "\b")
            .Replace("\\f", "\f")
            .Replace("\\n", "\n")
            .Replace("\\r", "\r")
            .Replace("\\t", "\t")
            .Replace("\\v", "\v")
            .Replace("\\0", "\0");
    }