2012-10-23 113 views
0

我正在創建一個控制檯應用程序,它將接收像get "www.site.com" -i -a這樣的參數。 但是這個參數不會是Main構造函數的args參數,我會從Console.ReadLine()收到它。 那麼如何解析我將從控制檯接收到的字符串[] args是否正確? 我需要假設客戶端可以寫類似get "www.google.com www.yahoo.com" -i -a,所以我ARGS應該是:字符串參數(字符串[])

  1. 得到
  2. 「www.google.com www.yahoo.com」
  3. -i
  4. - a
+5

[你有什麼試過](http://whathaveyoutried.com)? – Oded

+0

請詳細說明'-i'和'-a'是如何從引號內部到外部的。 – dasblinkenlight

+0

@dasblinkenlight我更新問題以將其刪除。 – MuriloKunze

回答

1

你可以使用正則表達式像

([^" ][^ ]*)|("[^"]*") 

相匹配的單一字符串。所以像

var r = new Regex("([^\" ][^ ]*)|(\"[^\"]*\")"); 
var s = Console.ReadLine(); 
var result = r.Matches(s).OfType<Match>().Select(m=>m.Value).ToArray(); 

應該得到你想要的數組。

+0

非常感謝,它也很完美。 – MuriloKunze

0

您可以使用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(); 
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]); 
    } 
} 

該解決方案的心臟是下面的正則表達式(引號未逃過可讀性):

(-?\\w+)|"([^"]*)" 

它有兩個捕獲組 - 第一個標誌或命令,第二個(在管道符號'|'後面)引用d字符串。一旦表達「看到」一個引號,它會捕獲所有內容,直到找到結束引用。捕獲組將兩個引號放在括號外面去除。

Link to ideone.

+0

完美,謝謝:) – MuriloKunze

+0

第一組不會捕捉特殊字符的參數。所以像「 - ?」這樣的論點(不含引號)不會被識別。 – MartinStettner

+0

@MartinStettner你能舉個例子嗎?它在這裏起作用。 – MuriloKunze