C# 命令列參數字串分割成字串陣列
本文旨在解決將包含命令列參數的單一字串分割成字串陣列的問題,如 C# 在命令列指定這些參數時一樣。
為何需要自訂函數?
不幸的是,C# 沒有內建函數可以根據特定字元條件分割字串。這對於此任務來說是理想的,因為我們希望基於空格進行分割,同時考慮帶有引號的字串。
正規表示式方案
有人可能會建議使用正規表示式 (regex) 來實現這一點。但是,正規表示式可能很複雜且難以維護,尤其是在正確處理帶引號的字串方面。
自訂分割函數
為了克服這個限制,我們將創建我們自己的自訂 Split 函數:
<code class="language-csharp">public static IEnumerable<string> Split(this string str, Func<char, bool> controller) { int nextPiece = 0; for (int c = 0; c < str.Length; c++) { if (controller(str[c])) { yield return str.Substring(nextPiece, c - nextPiece); nextPiece = c + 1; } } yield return str.Substring(nextPiece); }</code>
此函數採用謂詞作為參數,以確定字元是否應分割字串。
引號處理
為了處理引號的字串,我們定義了一個 TrimMatchingQuotes 擴充方法:
<code class="language-csharp">public static string TrimMatchingQuotes(this string input, char quote) { if ((input.Length >= 2) && (input[0] == quote) && (input[input.Length - 1] == quote)) return input.Substring(1, input.Length - 2); return input; }</code>
此方法僅刪除出現在字串開頭和結尾的匹配引號。
組合使用
結合這些技術,我們可以建立一個函數來分割命令列字串:
<code class="language-csharp">public static IEnumerable<string> SplitCommandLine(string commandLine) { bool inQuotes = false; return commandLine.Split(c => { if (c == '\"') inQuotes = !inQuotes; return !inQuotes && c == ' '; }) .Select(arg => arg.Trim().TrimMatchingQuotes('\"')) .Where(arg => !string.IsNullOrEmpty(arg)); }</code>
此函數基於空格分割字串,忽略帶引號字串中的空格。然後,它修剪每個參數,並刪除周圍的引號(如果存在)。
範例用法
要使用此函數:
<code class="language-csharp">string parameterString = @"/src:""C:\tmp\Some Folder\Sub Folder"" /users:""[email protected]"" tasks:""SomeTask,Some Other Task"" -someParam foo"; string[] parameterArray = SplitCommandLine(parameterString).ToArray();</code>
parameterArray 將包含與命令列字串對應的預期字串參數陣列。
以上是如何在 C# 中將命令列字串拆分為字串數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!