转义C#字符串

时间:2015-10-18 03:46:16

标签: c# string replace escaping

我在C#中编写了一个方法,它接受一个字符串并转义所有引号。它会逃脱它们,以便"变成\",变成\\\",变成\\\\\\\",依此类推。

这两个论点是inputdepth。深度确定了逃避它的次数。深度为1时,字符串He says "hello"变为He says \"hello\",而深度为2则变为He says \\\"hello\\\"

private string escapestring(string input, int depth)
    {
        string result = input;
        for (int i = 20; i >= 0; i--)
        {
            int nsearch = ((int)Math.Pow(2, i)) - 1;
            int nplus = ((int)Math.Pow(2, i + depth) - 1);
            string search = new string('\\', nsearch);
            search += "\"";
            result = result.Replace(search, "ESCAPE_REPLACE:" + (nplus).ToString());
        }
        for (int i = 20; i >= 0; i--)
        {
            int nsearch = ((int)Math.Pow(2, i)) - 1;
            string replace = new string('\\', nsearch);
            replace += "\"";
            result = result.Replace("ESCAPE_REPLACE:" + nsearch.ToString(), replace);
        }
        return result;
    }

这是我为解决这个任务而创建的。这真的太可怕了,只需更换每一组反斜杠,然后引用一个适合2^X-1模式的引号和一些任意blob,然后用转义版本替换任意blob。它最多只能工作20次,基本上很糟糕。

我认为它本身可以正常工作,但是我稍后会在一个循环中反复调用它,并且每次被调用时都会有40个循环,这会很难达到性能。

有关如何清理这件事的任何想法?我仍然认为自己很业余,所以我可能会遗漏一些非常简单的东西,但我的搜索没有找到任何有用的东西。

1 个答案:

答案 0 :(得分:2)

不确定所有数学的用途,但这样做:

private string escapestring(string input, int depth)
{
    var numSlashes = (int)(Math.Pow(2, depth)-1);
    return input.Replace("\"", new string('\\', numSlashes)+"\"");
}