C# 字符串到参数(字符串[])
我正在创建一个控制台应用程序,它将接收参数,如C# 字符串到参数(字符串[]),c#,C#,我正在创建一个控制台应用程序,它将接收参数,如get“www.site.com”-I-a。 但是这个args将不是主构造函数args参数,我将从Console.ReadLine()接收它。 那么,如何将从控制台接收的字符串解析为字符串[]args correct? 我需要假设客户端可以编写类似于获取“www.google.com www.yahoo.com”-I-a,因此我的参数应该是: 得到 “www.google.com www.yahoo.com” -我 -a 您可以使用Microsoft
get“www.site.com”-I-a
。
但是这个args将不是主构造函数args参数,我将从Console.ReadLine()
接收它。
那么,如何将从控制台接收的字符串解析为字符串[]args correct?
我需要假设客户端可以编写类似于获取“www.google.com www.yahoo.com”-I-a
,因此我的参数应该是:
您可以使用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();
您可以使用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();
您可以使用正则表达式进行简单的词法分析,如下所示:
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]);
}
}
此解决方案的核心是以下正则表达式(为了可读性,引号不转义):
它有两个捕获组-第一个用于标记或命令,第二个(在管道符号“|”之后)用于带引号的字符串。一旦表达式“看到”一个引号,它就会捕获所有内容,直到找到结束引号为止。捕获组通过将两个引号保留在括号外来剥离它们
您可以使用正则表达式进行简单的词法分析,如下所示:
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]);
}
}
此解决方案的核心是以下正则表达式(为了可读性,引号不转义):
它有两个捕获组-第一个用于标记或命令,第二个(在管道符号“|”之后)用于带引号的字符串。一旦表达式“看到”一个引号,它就会捕获所有内容,直到找到结束引号为止。捕获组通过将两个引号保留在括号外来剥离它们
您可以使用如下正则表达式
([^" ][^ ]*)|("[^"]*")
匹配单个字符串。大概是
var r = new Regex("([^\" ][^ ]*)|(\"[^\"]*\")");
var s = Console.ReadLine();
var result = r.Matches(s).OfType<Match>().Select(m=>m.Value).ToArray();
var r=newregex(“([^\”][^]*)|(\“[^\”]*”);
var s=Console.ReadLine();
var result=r.Matches.OfType().Select(m=>m.Value.ToArray();
应该可以得到所需的数组。可以使用以下正则表达式
([^" ][^ ]*)|("[^"]*")
匹配单个字符串。大概是
var r = new Regex("([^\" ][^ ]*)|(\"[^\"]*\")");
var s = Console.ReadLine();
var result = r.Matches(s).OfType<Match>().Select(m=>m.Value).ToArray();
var r=newregex(“([^\”][^]*)|(\“[^\”]*”);
var s=Console.ReadLine();
var result=r.Matches.OfType().Select(m=>m.Value.ToArray();
应为您获取所需的数组。?请详细说明
-i
和-a
如何从引号内到引号外。@dasblinkenlight我更新问题以删除它。?请详细说明-i
和-a
如何从引号内到引号外它们的外部。@dasblinkenlight我更新问题以删除它。第一组将不会捕获带有特殊字符的参数。所以像“-?”(不带引号)这样的论点不会被认可。@MartinStettner这里的表达式是给OP一个建立解决方案的起点。它提供了一个骨架;添加更多细节应该很简单。@MuriloKunze尝试输入get-?
,我想,“-?”参数将无法识别。@dasblinkenlight如果有人在不太了解正则表达式的情况下阅读并尝试它(知道的人根本不需要阅读它:),他可能很难找出为什么它对武断的论点不起作用。因此,我只想给出另一个提示,恕我冒犯:)@MuriloKunze如果您希望其他字符被识别为参数,请将\\w
替换为[^\“\\s]
第一组将不会捕获带有特殊字符的参数。因此像“-?”(不带引号)这样的参数不会被识别。@MartinStettner该表达式为OP提供了一个构建其解决方案的起点。它提供了一个框架;向其中添加更多细节应该很简单。@MuriloKunze尝试输入get-?
,我猜是“-?“参数将无法识别。@dasblinkenlight如果有人在不太了解正则表达式的情况下阅读并尝试此操作(知道的人根本不需要阅读此操作:),他可能很难找到为什么它对任意参数不起作用。因此,我只想给出另一个提示,无意冒犯:)@MuriloKunze如果您希望其他字符被识别为参数,请将\\w
替换为[^\“\\s]