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
,因此我的参数应该是:

  • 得到
  • “www.google.com www.yahoo.com”
  • -我
  • -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]