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 中国語 Web サイトの他の関連記事を参照してください。