コード例 #1
0
 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);
     }
 }
コード例 #2
0
ファイル: StringUtils.cs プロジェクト: duhaly/FormGenerator
        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;
        }