Mega Code Archive

 
Categories / C# / Data Types
 

Can parse a string representing a string[] into an actual string[]

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RestCake.Util {   public static class StringUtil   {     /// <summary>     /// Can parse a string representing a string[] into an actual string[].     /// You can delimit strings with nothing (though commas can't be in the string values), ' or ".     /// Surrounding [] chars are optional.     /// Examples:     ///    a,b,c     ///    'a','b','c'     ///    "a","b","c"     ///    [a,b,c]     ///    ['a','b','c']     ///    ["a","b","c"]     /// A space after a comma is ok, but if you aren't using a string delimiter, a space will be added to the next string's beginning (" b").     /// Escaped characters also work, such as ["foo, \"bar\"", "\"quoted string\"", "'single quoted with \" delimiter'"]     /// You can't mix delimiters.  Use all nothing, all ', or all ".  The first delimiter found will be used (at char index 0 or 1, depending on the wrapping []s presence)     /// </summary>     /// <param name="input"></param>     /// <returns></returns>     public static string[] ParseStringArray(string input)     {       if (String.IsNullOrWhiteSpace(input))         return null;              input = input.Trim();              bool brackets = input[0] == '[' && input[input.Length - 1] == ']';              // String delimeter can be ' or ", or nothing.       // Note that without a string delimeter, you can't have commas in your string, cause that's what we'll split on.       char delim = 'X';       // Depending on if we're brackets in []s or not, we'll look for the string delimiter at index 0 or 1       int delimIndex = brackets ? 1 : 0;              if (input[delimIndex] == '\'')         delim = '\'';       else if (input[delimIndex] == '"')         delim = '"';                //Console.WriteLine("input: " + input);       //Console.WriteLine("delim: " + delim);       //Console.WriteLine("brackets: " + brackets);              if (delim == 'X')       {         // easiest case, split on ,         if (brackets)           // Get rid of the wrapping []'s           return input.Substring(1, input.Length - 2).Split(',');         else           return input.Split(',');       }       // From here on, we KNOW we have a string delimiter of ' or "              bool inString = false;       bool escapeNext = false;       StringBuilder sb = new StringBuilder();       List<string> strings = new List<string>();              for(int i = 0; i < input.Length; ++i)       {         // Skip any possible wrapping [] chars         if (brackets && (i == 0 || i == input.Length - 1))           continue;         char c = input[i];         if (escapeNext)         {           //Console.WriteLine("escaping char: " + c);           escapeNext = false;           sb.Append(c);         }         else if (c == '\\' && inString)         {           //Console.WriteLine("Will escape next");           escapeNext = true;           sb.Append(c);         }         else if (c == delim)         {           //Console.WriteLine("at delim");           inString = !inString;         }         else if (c == ',')         {           Console.Write("at comma: ");           if (inString)           {             //Console.WriteLine("instring");             // This is a comma in the string             sb.Append(c);           }           else           {             //Console.WriteLine("out of string");             // This comma separates one string from another             //Console.WriteLine("end string");             strings.Add(sb.ToString());             sb.Clear();           }         }         else if (inString)         {           sb.Append(c);         }       }       // The last string wasn't added, because it gets added when a comma is encountered, and there's no last comma       strings.Add(sb.ToString());              return strings.ToArray();     }   } }