0

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

  1. 得到
  2. “www.google.com www.yahoo.com”
  3. -一世
  4. -一个
4

3 回答 3

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+)|"([^"]*)"

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

链接到ideone。

于 2012-10-23T14:51:52.923 回答
1

您可以使用正则表达式,例如

([^" ][^ ]*)|("[^"]*")

匹配单个字符串。所以像

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

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

于 2012-10-23T14:54:50.800 回答
0

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

string arguments = Console.ReadLine();
TextFieldParser parser = new TextFieldParser(new StringReader(arguments));
parser.Delimiters = new[] { " " };
parser.HasFieldsEnclosedInQuotes = true;
string[] parsedArguments = parser.ReadFields();
于 2012-10-23T14:49:48.780 回答