La chaîne de paramètres de ligne de commande C# est divisée en tableau de chaînes
Cet article vise à résoudre le problème de la division d'une seule chaîne contenant des paramètres de ligne de commande en un tableau de chaînes, comme le fait C# lors de la spécification de ces paramètres sur la ligne de commande.
Pourquoi avez-vous besoin d'une fonction personnalisée ?
Malheureusement, C# n'a pas de fonction intégrée pour diviser les chaînes en fonction de conditions de caractères spécifiques. C'est idéal pour cette tâche puisque nous souhaitons diviser en fonction des espaces, en tenant compte des chaînes entre guillemets.
Schéma d'expression régulière
Quelqu'un pourrait suggérer d'utiliser des expressions régulières (regex) pour y parvenir. Cependant, les expressions régulières peuvent être complexes et difficiles à maintenir, notamment lorsqu'il s'agit de gérer correctement les chaînes entre guillemets.
Fonction de segmentation personnalisée
Pour surmonter cette limitation, nous allons créer notre propre fonction Split personnalisée :
<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>
Cette fonction prend un prédicat comme argument pour déterminer si le caractère doit diviser la chaîne.
Traitement des guillemets
Pour gérer les chaînes entre guillemets, nous définissons une méthode d'extension 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>
Cette méthode supprime uniquement les guillemets correspondants qui apparaissent au début et à la fin de la chaîne.
Utiliser en combinaison
En combinant ces techniques, nous pouvons créer une fonction pour diviser les chaînes de ligne de commande :
<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>
Cette fonction divise une chaîne en fonction des espaces, en ignorant les espaces dans les chaînes entre guillemets. Il coupe ensuite chaque argument, en supprimant les guillemets environnants s'ils sont présents.
Exemple d'utilisation
Pour utiliser cette fonction :
<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 contiendra le tableau attendu de paramètres de chaîne correspondant à la chaîne de ligne de commande.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!