using System; using System.Collections.Generic; using System.Text; namespace Utilities { public class QuotedStringUtils { public static string Quote(string str) { return String.Format("\"{0}\"", str); } public static string Unquote(string str) { string quote = '"'.ToString(); if (str.Length >= 2 && str.StartsWith(quote) && str.EndsWith(quote)) { return str.Substring(1, str.Length - 2); } else { return str; } } public static bool IsQuoted(string str) { string quote = '"'.ToString(); if (str.Length >= 2 && str.StartsWith(quote) && str.EndsWith(quote)) { return true; } else { return false; } } public static int IndexOfUnquotedChar(string str, char charToFind) { return IndexOfUnquotedChar(str, charToFind, 0); } public static int IndexOfUnquotedChar(string str, char charToFind, int startIndex) { if (startIndex >= str.Length) { return -1; } bool inQuote = false; int index = startIndex; while (index < str.Length) { if (str[index] == '"') { inQuote = !inQuote; } else if (!inQuote && str[index] == charToFind) { return index; } index++; } return -1; } public static int IndexOfUnquotedString(string str, string stringToFind) { return IndexOfUnquotedString(str, stringToFind, 0); } public static int IndexOfUnquotedString(string str, string stringToFind, int startIndex) { if (startIndex >= str.Length) { return -1; } bool inQuote = false; int index = startIndex; while (index < str.Length) { if (str[index] == '"') { inQuote = !inQuote; } else if (!inQuote && str.Substring(index).StartsWith(stringToFind)) { return index; } index++; } return -1; } public static List SplitIgnoreQuotedSeparators(string str, char separator) { return SplitIgnoreQuotedSeparators(str, separator, StringSplitOptions.None); } public static List SplitIgnoreQuotedSeparators(string str, char separator, StringSplitOptions options) { List result = new List(); int nextEntryIndex = 0; int separatorIndex = IndexOfUnquotedChar(str, separator); while (separatorIndex >= nextEntryIndex) { string entry = str.Substring(nextEntryIndex, separatorIndex - nextEntryIndex); if (options != StringSplitOptions.RemoveEmptyEntries || entry != String.Empty) { result.Add(entry); } nextEntryIndex = separatorIndex + 1; separatorIndex = IndexOfUnquotedChar(str, separator, nextEntryIndex); } string lastEntry = str.Substring(nextEntryIndex); if (options != StringSplitOptions.RemoveEmptyEntries || lastEntry != String.Empty) { result.Add(lastEntry); } return result; } } }