1

スペースが一重引用符または二重引用符で示される文字列リテラル内にない場合、冗長な連続スペースを削除する関数を見つけようとしています。

    string source   = "sqlcmd.exe    -Q \"LEAVE     SQL TEXT HERE   UNCHANGED BECAUSE IT'S IN A DBL QUOTE BLOCK\"";
    string expected = "sqlcmd.exe -Q \"LEAVE     SQL TEXT HERE   UNCHANGED BECAUSE IT'S IN A DBL QUOTE BLOCK\"";
    string actual = StringExtensions.RemoveRedundantSpaces(source);
    Assert.AreEqual(expected, actual);
4

1 に答える 1

2

これは、最も単純なブルート フォース メソッドです (そして、簡単に拡張メソッドに変えることができます)。文字列の引用符が不適切な場合、期待どおりの結果が返されるとは限らないことに注意してください (ただし、解析しているバッチ ファイルの問題が指摘されます)。

    private static void TrimRedundantSpaces(string input)
    {
        Console.WriteLine(input);

        StringBuilder output = new StringBuilder();
        char previousChar = '\0';
        bool inSingleQuote = false;
        bool inDoubleQuote = false;

        for (int i = 0; i < input.Length; i++)
        {
            switch (input[i])
            {
                case '\'':
                    if (! inDoubleQuote)
                        inSingleQuote = !inSingleQuote;
                    output.Append(input[i]);
                    break;

                case '"':
                    if (! inSingleQuote)
                        inDoubleQuote = !inDoubleQuote;
                    output.Append(input[i]);
                    break;

                case ' ':
                    if ((previousChar != ' ') || inSingleQuote || inDoubleQuote)
                        output.Append(' ');
                    break;

                default:
                    output.Append(input[i]);
                    break;
            }

            previousChar = input[i];
        }

        Console.WriteLine(output.ToString());
        Console.WriteLine();
    }

    [STAThread]
    static void Main(string[] args)
    {
        TrimRedundantSpaces("sqlcmd.exe    -Q 'LEAVE     SQL TEXT HERE   UNCHANGED BECAUSE IT'S IN A DBL QUOTE BLOCK'");
        TrimRedundantSpaces("sqlcmd.exe    -Q \"LEAVE     SQL TEXT HERE   UNCHANGED BECAUSE IT'S IN A DBL QUOTE BLOCK\"");
        TrimRedundantSpaces("sqlcmd.exe    -Q \"LEAVE     'SQL TEXT' HERE   UNCHANGED BECAUSE IT'S IN A DBL QUOTE BLOCK\"");
        Console.ReadLine();
    }
于 2013-07-03T18:17:42.327 に答える