C# 从任何应用程序调用默认命令行解析方法

C# 从任何应用程序调用默认命令行解析方法,c#,command-line-arguments,C#,Command Line Arguments,我将一个复杂字符串作为参数传递给我的控制台应用程序。我注意到,在我的Main方法中,生成的string[]args数组就是我希望将该字符串解析为的数组 现在,我希望能够解析这种格式的字符串,并在我的框架的其他部分,在控制台应用程序/进程之外,获得相同的string[],而不想重新发明轮子。我试图查看是否可以找到并调用框架方法,该方法用于解析传递给Main方法的命令行参数,但找不到任何内容。我读过一些命令行解析选项,包括NDesk,但在我目前的情况下无法使用它 有人知道这个框架方法吗?或者有其他想

我将一个复杂字符串作为参数传递给我的控制台应用程序。我注意到,在我的Main方法中,生成的
string[]args
数组就是我希望将该字符串解析为的数组

现在,我希望能够解析这种格式的字符串,并在我的框架的其他部分,在控制台应用程序/进程之外,获得相同的
string[]
,而不想重新发明轮子。我试图查看是否可以找到并调用框架方法,该方法用于解析传递给Main方法的命令行参数,但找不到任何内容。我读过一些命令行解析选项,包括NDesk,但在我目前的情况下无法使用它


有人知道这个框架方法吗?或者有其他想法吗?

使用正则表达式:

string input = "this is \"a string\" separated by spaces \"with quotes\" also";
Regex r = new Regex("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
var matches = r.Matches(input);
图一个好的解释:

[^\\s\”]+
匹配1+个字符,最多一个空格或双引号

|

\”([^\“]*)\”
匹配双引号内的0多个字符,而双引号本身不是双引号

|

“([^']*)”
匹配不是单引号本身的单引号内的0多个字符

另外,我对.net正则表达式不太在行,但从我所能看出,当涉及到匹配组时,它们很奇怪。为了得到不带引号的字符串,我不得不做一个奇怪的循环:

 var matches = r.Matches(input);
 foreach (Match match in matches)
 {
      Console.WriteLine(match.Groups[1].Value);
 }

如果你在windows上运行,你可以调用一个API(不管pinvoke.net怎么说,vista都支持它)。显然,这不是跨平台的

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
   [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine,
   out int pNumArgs);

示例代码

为什么不能使用NDesk.Options(或其近亲Mono.Options)?我们必须知道,如果我们要建议一些替代方案,那么进入控制台应用程序的字符串数组本质上不就是
var stringArray=someString.Split(new{'},StringSplitOptions.removemptyentries)
?@Scott:这不完全正确。它不会在每个空间上都拆分。我的字符串有引号,引号中的单词之间有空格。但是那些引用中的单词作为一个字符串出现,请看CLAP(),谢谢。这是你想出来的还是你用反射得到的。提出这种特定的模式匹配背后有什么理论依据吗?正则表达式只是我的答案。根据我对windows上的命令行参数的了解,特定的模式与之匹配。@desigeek:是否支持转义,例如
“它包含一个\”(双引号)字符“
?@Martin:是的,我想支持转义。我并不完全了解默认解析器所做的一切。但是我想要的是在默认解析器的结果和我选择的任何方法之间保持一致。这就是为什么调用默认方法本身更好的原因。@desigek,在这种情况下,这个正则表达式不起作用。您可能需要使用一些正则表达式来解决这个问题,但最好只使用一个解析(或者是现成的,或者是您自己的)。在.NET Framework中没有用于此操作的默认方法。这是由环境来处理的。