C# 将命令行字符串解析为字符串列表

C# 将命令行字符串解析为字符串列表,c#,C#,我想将以下字符串作为输入: first-arg second-arg "third arg with spaces" "arg with \" quotes" 并将此字符串列表作为输出返回 ["first-arg", "second-arg", "third arg with spaces", "arg with \" quotes"] 是否有任何nuget包或内置函数可以做到这一点?我希望它能够处理边缘情况,比如包含多个单词的参数和包含引号的参数 string[] arguments =

我想将以下字符串作为输入:

first-arg second-arg "third arg with spaces" "arg with \" quotes"
并将此字符串列表作为输出返回

["first-arg", "second-arg", "third arg with spaces", "arg with \" quotes"]
是否有任何nuget包或内置函数可以做到这一点?我希望它能够处理边缘情况,比如包含多个单词的参数和包含引号的参数

string[] arguments = Environment.GetCommandLineArgs();

有关更多信息,请参见该类满足要求的

。这不是最有效的方法,但它返回正确的参数

public static class ArgumentLineParser
{
    public static string[] ToArguments(string cmd)
    {
        if (string.IsNullOrWhiteSpace(cmd))
        {
            return new string[0];
        }

        var argList = new List<string>();
        var parseStack = new Stack<char>();
        bool insideLiteral = false;

        for (int i = 0; i < cmd.Length; i++)
        {
            bool isLast = i + 1 >= cmd.Length;

            if (char.IsWhiteSpace(cmd[i]) && insideLiteral)
            {
                // Whitespace within literal is kept
                parseStack.Push(cmd[i]);
            }
            else if (char.IsWhiteSpace(cmd[i]))
            {
                // Whitespace delimits arguments
                MoveArgumentToList(parseStack, argList);
            }
            else if (!isLast && '\\'.Equals(cmd[i]) && '"'.Equals(cmd[i + 1]))
            {
                //Escaped double quote
                parseStack.Push(cmd[i + 1]);
                i++;
            }
            else if ('"'.Equals(cmd[i]) && !insideLiteral)
            {
                // Begin literal
                insideLiteral = true;
            }
            else if ('"'.Equals(cmd[i]) && insideLiteral)
            {
                // End literal
                insideLiteral = false;
            }
            else
            {
                parseStack.Push(cmd[i]);
            }
        }

        MoveArgumentToList(parseStack, argList);

        return argList.ToArray();
    }

    private static void MoveArgumentToList(Stack<char> stack, List<string> list)
    {
        var arg = string.Empty;
        while (stack.Count > 0)
        {
            arg = stack.Pop() + arg;
        }

        if (arg != string.Empty)
        {
            list.Add(arg);
        }
    }
}

我使用了一个叫做Consolas的工具来做类似的事情。那是很久以前的事了,所以我记不清它到底能做什么。这很难吗?我能看到的唯一例外是sequence
\”
,例如,您可以在拆分/查找/which之前用某物替换它。一个好的CSV解析器应该为您处理这个问题。因为在标题中您说“parse command line string”,所以您实际上不需要做任何事情。若您提供的有问题的行作为命令行参数传递给您的应用程序,它将在
Main(string[]arguments)
函数中被正确解析为包含4个元素的数组。
var line = @"first-arg second-arg ""third arg with spaces"" ""arg with \"" quotes""";
var args = ArgumentLineParser.ToArguments(line);