Unescape逃脱了字符串?

我们将DatabaseDelimiter配置(我们用来分隔内容)存储在Database中作为字符串(可以是“tab”,即\ t或新行\ r \ n)

稍后我们想使用这个配置,我怎样才能将\t (字符串,而不是聊天)转换为tab char?

例:

 string delimiterConfig = config.GetDelimiter(); char[] delimiter = ConvertConfig(delimiterConfig); 

ConvertConfig将如何显示,以便将所有转义的字符串解析回字符,以便“\ t”字符串变为\t char。

任何优雅的解决方案,不使用case语句和替换?

这是一个优雅的解决方案,带有switch语句, Regex.Replace方法和自定义MatchEvaluator :

 var input = @"This is indented:\r\n\tHello World"; var output = Regex.Replace(input, @"\\[rnt]", m => { switch (m.Value) { case @"\r": return "\r"; case @"\n": return "\n"; case @"\t": return "\t"; default: return m.Value; } }); Console.WriteLine(output); 

输出:

这是缩进的:
        你好,世界

如果通过“更好”的解决方案,你的意思更快:

 static String Replace(String input) { if (input.Length <= 1) return input; // the input string can only get shorter // so init the buffer so we won't have to reallocate later char[] buffer = new char[input.Length]; int outIdx = 0; for (int i = 0; i < input.Length; i++) { char c = input[i]; if (c == '\\') { if (i < input.Length - 1) { switch (input[i + 1]) { case 'n': buffer[outIdx++] = '\n'; i++; continue; case 'r': buffer[outIdx++] = '\r'; i++; continue; case 't': buffer[outIdx++] = '\t'; i++; continue; } } } buffer[outIdx++] = c; } return new String(buffer, 0, outIdx); } 

这比使用Regex要快得多。 特别是当我测试这个输入:

 var input = new String('\\', 0x1000); 

如果“更好”意味着更容易阅读和维护,那么Regex解决方案可能会获胜。 我的解决方案中也可能存在错误; 我没有彻底测试它。

对于有限的基本ASCII分隔符集,您还有一个简单的解决方案:

 Regex.Unescape(input) 

您可以在MSDN文档中阅读所有相关内容,但基本上它适用于所有正则表达式分隔符和空格文字。

请注意,它会抛出未知的转义序列。

如果更好,你指的是支持缺乏转义序列,那么我建议你查看我对标题为:评估转义字符串的回答,该字符串处理标准转义序列,八进制转义序列和Unicode转义序列。 我希望您发现这个解决方案更优雅,更符合您的需求。

ToCharArray方法怎么样?

 string x = "\r\n"; char[] delimeter = x.ToCharArray();