private static void TestSplits(Dictionary<string, List<string>> tests, DelimiterInclude includeDelimiter, bool brackets = false) { foreach (var test in tests) { List<string> blocks = test.Key.SplitIntoBlocks(brackets ? new[] {'(', ')'} : null, brackets, includeDelimiter); List<string> expected = test.Value; for (int i = 0; i < blocks.Count; ++i) Assert.AreEqual(expected[i], blocks[i], test.Key); Assert.AreEqual(expected.Count, blocks.Count, test.Key); } }
public static List<string> SplitIntoBlocks(this string parent, char[] delimiters = null, bool paired = false, DelimiterInclude includeDelimiters = DelimiterInclude.IncludeInline) { int delimiter = -1; int count = 0; bool escape = false; List<char> ends; List<char> starts; CreateDelimiterArrays('1', delimiters, paired, out starts, out ends); List<string> blocks = new List<string>(); string current = ""; foreach (char c in parent) { if (escape) { escape = false; if ((starts.Contains(c) || ends.Contains(c)) && includeDelimiters == DelimiterInclude.IncludeInline) current += "\\"; current += c; } else if (c == '\\') { escape = true; } else if (delimiter != -1) { if (ends[delimiter] == c) { if (count == 0) { delimiter = -1; if (includeDelimiters == DelimiterInclude.IncludeInline) current += c; blocks.Add(current); if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add("" + c); current = ""; } else if (paired) { --count; current += c; } } else if (paired && starts[delimiter] == c) { ++count; current += c; } else { current += c; } } else { if (starts.Contains(c)) { delimiter = starts.IndexOf(c); if (!string.IsNullOrWhiteSpace(current)) { if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add(""); blocks.Add(current); if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add(""); } current = ""; if (includeDelimiters == DelimiterInclude.IncludeInline) current += c; else if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add("" + c); } else { current += c; } } } if (!string.IsNullOrWhiteSpace(current)) { if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add(""); blocks.Add(current); if (includeDelimiters == DelimiterInclude.IncludeSeparately) blocks.Add(""); } return blocks; }