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中文网其他相关文章!