我们将DatabaseDelimiter配置(我们用来分隔内容)存储在Database中作为字符串(可以是“tab”,即\ t,或新行\ r \ n)
稍后我们想使用此配置,如何将\t
(字符串,而不是聊天)转换为tab char?
示例:
string delimiterConfig = config.GetDelimiter();
char[] delimiter = ConvertConfig(delimiterConfig);
ConvertConfig将如何显示,以便将所有转义的字符串解析回字符,以便“\ t”字符串变为\t
char。
任何优雅的解决方案,不使用case语句并替换?
答案 0 :(得分:4)
这是一个优雅的解决方案,带有switch语句,Regex.Replace Method和自定义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);
输出:
This is indented: Hello World
答案 1 :(得分:4)
如果通过“更好”的解决方案,你的意思更快:
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);
如果“更好”意味着更容易阅读和维护,那么正则表达式解决方案可能会获胜。我的解决方案中也可能存在错误;我没有彻底测试它。
答案 2 :(得分:2)
对于有限的基本ASCII分隔符集,您还有一个简单的解决方案:
Regex.Unescape(input)
您可以在MSDN文档中阅读所有相关内容,但基本上它适用于所有正则表达式分隔符和空白文字。
请注意它会引发未知的转义序列。
答案 3 :(得分:1)
如果更好的是,你指的是支持的缺失转义序列,那么我建议你查看处理标准转义序列,八进制转义序列和Unicode转义序列的my response to the question titled: Evaluate escaped string。我希望你发现这个解决方案更优雅,更符合你的需求。
答案 4 :(得分:0)
ToCharArray方法怎么样?
string x = "\r\n";
char[] delimeter = x.ToCharArray();