我正在创建一个控制台应用程序,它将接收get "www.site.com" -i -a
之类的参数。
但是这个args不是Main构造函数args参数,我将从Console.ReadLine()
收到它。
那么如何将我将从控制台收到的字符串解析为string [] args正确?
我需要假设客户端可以编写类似get "www.google.com www.yahoo.com" -i -a
的内容,所以我的args应该是:
答案 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+)|"([^"]*)"
它有两个捕获组 - 第一个用于标记或命令,第二个用于引用字符串的管道符号“|”之后。一旦表达式“看到”引号,它就会捕获所有内容,直到找到结束引号。捕获组通过将它们保留在括号之外来删除两个引号。
答案 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();