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