2010-09-09 53 views
3

我被困在正则表达式中。该程序是用C#编写的控制台应用程序。有几个命令。我想检查参数是否正确。我想它很容易与正则表达式,但不能做到这一点:如何用正则表达式检查参数?

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] 

的问题是,程序接受的所有命令。另外我需要检查“ - ”前缀的命令是否在域之前。我认为这个问题并不难解决。

谢谢...

+4

哇,并认为我只是使用开关因为我更容易编码和维护:\ – jcolebrand 2010-09-09 15:01:19

回答

4

因为你最终会写一个switch语句反正进程的选项,你会更好做的检查有:

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

感谢您的回答:) – PythEch 2010-09-09 15:16:15

2

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

要不是你与你的正则表达式的具体问题 - 选项都是可选的,那么你对阵一个空格,然后什么完全可以包含任何可能包含无效域名和/或无效选项的内容。到目前为止,例如,这根据你的正则表达式是有效的:

program.exe -c -invalid 

一种方式通过更精确的有关站点允许的字符,而不是仅仅匹配任何东西,以改善这一点。

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

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

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

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

不要推倒重来,处理命令行参数是一个解决的问题。

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

+0

我从来没有真正见过该图书馆,但我喜欢这个想法。感谢分享。现在,当我想向某人解释这些属性时,我也有一个很好的库来转换属性示例;) – jcolebrand 2010-09-09 15:28:12

0

实际上,实现命令行参数解析最简单的方法是创建一个powershell命令行开关。这给你一个非常好的方式来处理参数。

0

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

首先,定义的变量:

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