移除字符串末尾所有系列的实例

3
假设我们有一个返回字符数组定义的程序 - 这样我们就可以将其复制粘贴到其他C#代码中。可能的结果之一是以下字符串:
// Current output:
return "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}" + "};";

现在我们希望消除CharArray末尾的额外空行,同时保留开头或中间的任何空行。
// Desired output:
"CharArray = { {}, {123}, {}, {3 3}, {111}" + "};";

任何空行都是必要的,以便为间隔原因保留数据,但末尾的空格对我们的代码没有任何作用。

由于最后的括号和分号直到操作完成后才添加,因此似乎最简单的方法是从字符串中删除所有尾随的", {}"实例。 我目前的解决方案是替换和修剪的非常独特的组合...

// Red-Green solution:
return output.Replace(", {}", "!").TrimEnd('!').Replace("!", ", {}") + "};";

尽管这种方法肯定可以返回正确的结果,但它过于冗长,让读者感到困惑,当你第一次阅读时很可能会不舒服。

另外,我通常会使用 Regex.Replace 来解决这类问题,但是这种方法只能删除一个空行(因为字符串末尾只有一个空行),我不想用循环来处理。

// Sub-par solution: (birdie solution?)
 return Regex.Replace(testString, ", {}$", "") + "};";

我该如何最好地从字符串的末尾删除所有一系列字符?我希望结果既易读又不会对机器造成太大负担和速度缓慢。(目前用户按下按钮后,返回结果几乎是瞬间的。)

3个回答

1

您可以使用正则表达式:

return "\n" + Regex.Replace(testString, "(, {})+$", "") + "};";

这将替换搜索字符串的多个出现次数

+ 运算符表示:前面的表达式出现一次或多次


0

试试这个:

    string TrimEndMultiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        // Addendum:
        return str.Substring(0, start + lenend);
    }

你的答案会返回正确的值,但是它会导致可读性和性能下降。我建议使用Fix的修复方法来解决我的问题和类似的问题。 - 4444
这是一个更通用的解决方案,而且效率更高(除非你使用不安全的代码)。只需测量即可。 - Feng Yuan
啊,不对 - 仔细查看后,它在 while 循环中卡住了。(我只是觉得它花了很长时间。) - 4444
循环现在运行良好(尽管您的输出与我想要的相反)。即便如此,它仍然比两个选项都要慢,特别是在重复时最明显,但对于一个调用来说差异几乎不可察觉。 - 4444

0

我试过了,TrimEndMultiple快了20倍:

    [MethodImplAttribute(MethodImplOptions.NoInlining)] 
    static string TrimEndMutiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        return str.Substring(0, start + lenend);
    } 

    static void Main(string[] args)
    {
        string s = "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}";

        Regex reg = new Regex("(, {})+$", RegexOptions.Compiled);

        string s1 = reg.Replace(s, "");
        string s2 = TrimEndMutiple(s, ", {}");

        Stopwatch watch = new Stopwatch();

        int count = 1000 * 100;

        watch.Start();

        for (int i = 0; i < count; i++)
        {
            s1 = reg.Replace(s, "");
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s1, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);

        watch.Restart();

        for (int i = 0; i < count; i++)
        {
            s2 = TrimEndMutiple(s, ", {}"); 
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s2, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);
    }

结果:

CharArray = { {}, {123}, {}, {3 3}, {111}   298.014 ms
CharArray = { {}, {123}, {}, {3 3}, {111}    15.495 ms

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