【问题标题】:How to check the arguments with Regex?如何使用正则表达式检查参数?
【发布时间】:2010-09-09 14:59:51
【问题描述】:

我被正则表达式困住了。该程序是用 C# 编写的控制台应用程序。有几个命令。我想首先检查参数是否正确。我认为使用 Regex 会很容易,但做不到:

var strArgs = "";

foreach (var x in args)
{
    strArgs += x + " ";
}
if (!Regex.IsMatch(strArgs, @"(-\?|-help|-c|-continuous|-l|-log|-ip|)* .{1,}"))
{
    Console.WriteLine("Command arrangement is wrong. Use \"-?\" or \"-help\" to see help.");
    return;
}

用法是:

program.exe [-options] [domains]

问题是,程序接受所有命令。我还需要检查域之前的“-”前缀命令。我觉得这个问题不难解决。

谢谢...

【问题讨论】:

  • 哇,想想我只是使用一个开关,因为它更容易编码和维护:\

标签: c# .net regex


【解决方案1】:

由于无论如何您最终都会编写一个 switch 语句来处理选项,所以最好在那里进行检查:

switch(args[i])
{
case "-?": ...
case "-help": ...
...
default:
  if (args[i][0] == '-')
    throw new Exception("Unrecognised option: " + args[i]);
}

【讨论】:

    【解决方案2】:

    首先,解析命令行参数不要使用正则表达式。这是一个我认为你应该看看的相关问题:

    但是对于您的正则表达式的具体问题 - 选项是可选的,然后您匹配一个空格,然后是任何内容,其中任何内容都可以包括例如无效域和/或无效选项。到目前为止,根据您的正则表达式,这是有效的示例:

    program.exe -c -invalid
    

    一种改善这一点的方法是更精确地了解域中允许的字符,而不是仅仅匹配任何内容。

    您的正则表达式的另一个问题是您不允许开关之间有空格。要处理这个问题,您可能需要这样的东西:

    (?:(?:-\?|-help|-c|-continuous|-l|-log|-ip) +)*
    

    我还想指出,您应该使用string.Join 而不是您当前使用的循环。

    string strArgs = string.Join(" ", args);
    

    【讨论】:

      【解决方案3】:

      不要重新发明轮子,处理命令行参数是一个已解决的问题。

      我已经很好地利用了Command Line Parser Library for .Net

      【讨论】:

      • 我从未真正见过那个库,但我喜欢这个主意。感谢分享。现在,当我想向某人解释属性示例时,我也有一个很好的库可以转到属性示例;)
      【解决方案4】:

      实际上实现命令行参数解析的最简单方法是创建一个 powershell commandlet。这为您提供了一种处理参数的非常好的方法。

      【讨论】:

        【解决方案5】:

        我一直在成功使用这个功能......也许它对其他人有用......

        首先,定义你的变量:

        private string myVariable1;
        private string myVariable2;
        private Boolean debugEnabled = false;
        

        然后,执行函数:

        loadArgs();
        

        并将函数添加到您的代码中:

            private void loadArgs()
            {
                const string namedArgsPattern = "^(/|-)(?<name>\\w+)(?:\\:(?<value>.+)$|\\:$|$)";
                System.Text.RegularExpressions.Regex argRegEx = new System.Text.RegularExpressions.Regex(namedArgsPattern, System.Text.RegularExpressions.RegexOptions.Compiled);
                foreach (string arg in Environment.GetCommandLineArgs())
                {
                    System.Text.RegularExpressions.Match namedArg = argRegEx.Match(arg);
                    if (namedArg.Success)
                    {
                        switch (namedArg.Groups["name"].ToString().ToLower())
                        {
                            case "myArg1":
                                myVariable1 = namedArg.Groups["value"].ToString();
                                break;
                            case "myArg2":
                                myVariable2 = namedArg.Groups["value"].ToString();
                                break;
                            case "debug":
                                debugEnabled = true;
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        

        要使用它,您可以使用带有正斜杠“/”或破折号“-”的命令语法:

        myappname.exe /myArg1:Hello /myArg2:Chris -debug
        

        【讨论】:

          【解决方案6】:

          此正则表达式将命令行参数解析为匹配项和组,以便您可以基于此正则表达式构建解析器。

          ((?:|^\b|\s+)--(?&lt;option_1&gt;.+?)(?:\s|=|$)(?!-)(?&lt;value_1&gt;[\"\'].+?[\"\']|.+?(?:\s|$))?|(?:|^\b)-(?&lt;option_2&gt;.)(?:\s|=|$)(?!-)(?&lt;value_2&gt;[\"\'].+?[\"\']|.+?(?:\s|$))?|(?&lt;arg&gt;[\"\'].+?[\"\']|.+?(?:\s|$)))

          此正则表达式将解析以下内容并适用于几乎所有语言

          --in-argument hello --out-stdout false positional -x
          --in-argument 'hello world"
          "filename"
          --in-argument="hello world'
          --in-argument='hello'
          --in-argument hello
          "hello"
          helloworld
          --flag-off
          -v
          -x="hello"
          -u positive
          C:\serverfile
          --in-arg1='abc' --in-arg2=hello world c:\\test
          

          试试Regex101

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-27
            • 1970-01-01
            • 2012-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-05
            • 1970-01-01
            相关资源
            最近更新 更多