Unescape逃脱了字符串?

时间:2011-07-18 16:09:56

标签: c# string escaping

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

稍后我们想使用此配置,如何将\t(字符串,而不是聊天)转换为tab char?

示例:

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

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

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

5 个答案:

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