Как я могу использовать escape-последовательности в стиле .NET в значениях времени выполнения? - PullRequest
1 голос
/ 17 июня 2011

Эта проблема возникает у меня, когда я записываю значение разделителя в файл конфигурации XML, обычно, когда вы пишете строку, такую ​​как "\t", в конфигурации XML, класс синтаксического анализатора, такой как XDocument, автоматически преобразует ее в @"\\t", так чтовы получаете обратную косую черту и 't' из строки, которая анализируется из конфигурации.Однако мне нужен только символ табуляции, а не двухсимвольная строка.

Таким образом, проблема превращается в: учитывая строку, содержащую escape-последовательность, такую ​​как "\t", как мне преобразовать ее в одну?-символ вкладки?

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

Как насчет простого удаления префикса @?

Дословные и обычные строковые литералы - это способы записи строк в исходном коде.Во время выполнения нет никакой разницы между ними.Тогда это просто строки.

Если вы хотите обрабатывать escape-последовательности во время выполнения, вы можете сделать что-то вроде следующего:

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();
}
2 голосов
/ 17 июня 2011

Вы можете сделать что-то вроде этого:

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

Я написал следующий метод для замены набора общих последовательностей escape-символов.

    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");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...