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();