【问题标题】:Invoke default command line parsing method from any application从任何应用程序调用默认命令行解析方法
【发布时间】:2011-10-18 16:49:57
【问题描述】:

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

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

有人知道这个框架方法吗?或者有什么其他想法可以解决这个问题?

【问题讨论】:

  • 为什么不能使用 NDesk.Options(或其表亲 Mono.Options)?如果我们要提出一些替代方案,我们必须知道这一点。
  • 进入控制台应用程序的字符串数组不只是var stringArray = someString.Split(new {' '}, StringSplitOptions.RemoveEmptyEntries)吗?
  • @Scott:这并不完全正确。它不会在每个空间上拆分。我的字符串有引号,引号内的单词之间有空格。但是引号中的那些词作为一个字符串出现

标签: c# command-line-arguments


【解决方案1】:

使用正则表达式:

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 调用(它支持过去的 vista,无论 pinvoke.net 说什么)。显然这不是跨平台的。

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

示例代码here

【讨论】:

  • 谢谢。你是想出这个还是你用反射来得到这个。提出这种特定的模式匹配背后有什么理论吗?
  • Regex 只是我的首选答案。仅根据我对 Windows 命令行参数的了解,匹配它的特定模式。
  • @desigeek:你想支持转义吗,比如"this contains a \"(double quote) character"
  • @Martin:是的,我想支持转义。我并不完全了解默认解析器所做的一切。但我想要的是在默认解析器的结果和我选择的任何方法之间保持一致。这就是为什么我自己调用默认方法会更好。
  • @desigeek,在这种情况下,这个正则表达式不起作用。您可能会制定一些正则表达式来解决这个问题,但最好只使用解析(现成的或您自己的)。 .NET Framework 中没有默认的方法。这是由环境处理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2022-08-24
  • 2014-04-24
相关资源
最近更新 更多