2010-09-09 78 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