转义转义字符串?

4
我们将ContentDelimiter配置(用于分隔内容)作为字符串存储在数据库中(可以是“tab”,即\t,或新行\r\n)。
稍后我们想要使用这个配置,如何将字符串"\t"转换为制表符字符?
示例:
string delimiterConfig =  config.GetDelimiter();
char[] delimiter = ConvertConfig(delimiterConfig);

如何编写ConvertConfig,以便将所有转义字符串解析回字符,使 "\t" 字符串变成 \t 字符。

有没有不使用 case 语句和 replace 函数的优雅解决方案?


你可以即兴创建一些代码,编译并运行它。使用switch/case或SortedDictionary会更简单。 - Skizz
是的,但这意味着您需要为每种转义情况编写一个案例。非常惊讶的是,.NET没有针对此的扩展。 - Bek Raupov
5个回答

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

这比使用正则表达式要快得多。特别是当我测试这个输入时:

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

如果你说“更好”的意思是更易于阅读和维护,那么正则表达式解决方案可能更胜一筹。我的解决方案中也可能存在错误;我没有进行非常彻底的测试。

3
这里有一个优雅的解决方案,使用了 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);

输出:

这是缩进的:
        你好,世界

Jon Skeet在类似的帖子中提到了类似的解决方案,想知道是否有比这更好的解决方案。 - Bek Raupov
你有一个字符串,想要替换其中的部分并且有多种情况。因此,任何解决方案都将以某种形式“使用case语句和replace”为基础,因为这正是你所需要的。问题是:你是否必须自己实现它,或者.NET Framework中是否有任何方法可以为你完成它。答案是:你必须自己实现它(或从网上复制代码片段)。 - dtb
我在想是否有比这个更好的解决方案。 请定义“更好”。 - MarkPflug
是的,当我说到“内置”时,我的意思是指某些已经构建好的东西。 - Bek Raupov

2
对于有限的基本ASCII分隔符,你也有一个简单的解决方案:
Regex.Unescape(input)

你可以在MSDN文档中了解所有相关信息,但基本上它可以与所有正则表达式分隔符和空格文字一起使用。请注意,它会在遇到未知的转义序列时报错。

1
如果你所说的“更好”是指缺少转义序列的支持,那么我建议你查看我的回答,标题为:评估转义字符串,它处理标准转义序列、八进制转义序列和Unicode转义序列。我希望你会发现这个解决方案更加优雅和适合你的需求。

0

ToCharArray方法怎么样?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接