字符串到args(string [])

时间:2012-10-23 14:36:09

标签: c#

我正在创建一个控制台应用程序,它将接收get "www.site.com" -i -a之类的参数。 但是这个args不是Main构造函数args参数,我将从Console.ReadLine()收到它。 那么如何将我将从控制台收到的字符串解析为string [] args正确? 我需要假设客户端可以编写类似get "www.google.com www.yahoo.com" -i -a的内容,所以我的args应该是:

  1. 获得
  2. “www.google.com www.yahoo.com”
  3. -i
  4. -a

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式进行简单的词法分析,如下所示:

var s = @"get ""www.google.com www.yahoo.com"" -i -a";
var ms = Regex.Matches(s, "(-?\\w+)|\"([^\"]*)\"");
foreach (Match m in ms) {
    if (m.Groups[1].ToString() != "") {
         Console.WriteLine("Flag/Command: {0}", m.Groups[1]);
    } else {
        Console.WriteLine("Quoted string: '{0}'", m.Groups[2]);
    }
}

此解决方案的核心是以下正则表达式(为了便于阅读,引号是未转义的):

(-?\\w+)|"([^"]*)"

它有两个捕获组 - 第一个用于标记或命令,第二个用于引用字符串的管道符号“|”之后。一旦表达式“看到”引号,它就会捕获所有内容,直到找到结束引号。捕获组通过将它们保留在括号之外来删除两个引号。

Link to ideone.

答案 1 :(得分:1)

你可以使用像

这样的正则表达式
([^" ][^ ]*)|("[^"]*")

匹配单个字符串。像

这样的东西
var r = new Regex("([^\" ][^ ]*)|(\"[^\"]*\")");
var s = Console.ReadLine();
var result = r.Matches(s).OfType<Match>().Select(m=>m.Value).ToArray();

应该为您提供所需的数组。

答案 2 :(得分:0)

您可以使用Microsoft.VisualBasic.dll中的TextFieldParser类。

string arguments = Console.ReadLine();
TextFieldParser parser = new TextFieldParser(new StringReader(arguments));
parser.Delimiters = new[] { " " };
parser.HasFieldsEnclosedInQuotes = true;
string[] parsedArguments = parser.ReadFields();