C# Extension Method - String Split that also accepts an Escape Character

后端 未结 10 1718
我在风中等你
我在风中等你 2020-12-17 00:19

I\'d like to write an extension method for the .NET String class. I\'d like it to be a special varation on the Split method - one that takes an escape character to prevent s

10条回答
  •  一个人的身影
    2020-12-17 00:44

    You can try something like this. Although, I would suggest implementing with unsafe code for performance critical tasks.

    public static class StringExtensions
    {
        public static string[] Split(this string text, char escapeChar, params char[] seperator)
        {
            return Split(text, escapeChar, seperator, int.MaxValue, StringSplitOptions.None);
        }
    
        public static string[] Split(this string text, char escapeChar, char[] seperator, int count)
        {
            return Split(text, escapeChar, seperator, count, StringSplitOptions.None);
        }
    
        public static string[] Split(this string text, char escapeChar, char[] seperator, StringSplitOptions options)
        {
            return Split(text, escapeChar, seperator, int.MaxValue, options);
        }
    
        public static string[] Split(this string text, char escapeChar, char[] seperator, int count, StringSplitOptions options)
        {
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }
    
            if (text.Length == 0)
            {
                return new string[0];
            }
    
            var segments = new List();
    
            bool previousCharIsEscape = false;
            var segment = new StringBuilder();
    
            for (int i = 0; i < text.Length; i++)
            {
                if (previousCharIsEscape)
                {
                    previousCharIsEscape = false;
    
                    if (seperator.Contains(text[i]))
                    {
                        // Drop the escape character when it escapes a seperator character.
                        segment.Append(text[i]);
                        continue;
                    }
    
                    // Retain the escape character when it escapes any other character.
                    segment.Append(escapeChar);
                    segment.Append(text[i]);
                    continue;
                }
    
                if (text[i] == escapeChar)
                {
                    previousCharIsEscape = true;
                    continue;
                }
    
                if (seperator.Contains(text[i]))
                {
                    if (options != StringSplitOptions.RemoveEmptyEntries || segment.Length != 0)
                    {
                        // Only add empty segments when options allow.
                        segments.Add(segment.ToString());
                    }
    
                    segment = new StringBuilder();
                    continue;
                }
    
                segment.Append(text[i]);
            }
    
            if (options != StringSplitOptions.RemoveEmptyEntries || segment.Length != 0)
            {
                // Only add empty segments when options allow.
                segments.Add(segment.ToString());
            }
    
            return segments.ToArray();
        }
    }
    

提交回复
热议问题