zoukankan      html  css  js  c++  java
  • 字符串分割(String.Split)时连同分隔符一起返回

    今天有个群友问了这个问题:"字符串分割时,如何连同分隔符一起返回?"

    我这里写了个String扩展类,模仿原生的Split方法,与原生Split方法的区别在于多了个返回分隔符的枚举功能。

    class Program
    {
    	static void Main(string[] args)
    	{
    		var flagEx = StringSplitOptionsEx.RemoveEmptyEntries | StringSplitOptionsEx.ReturnSepapator | StringSplitOptionsEx.TrimEntries;
    		var result = "  A | B | |C|D".Split("|", flagEx);
    		Console.WriteLine(result);
    	}
    }
    
    [Flags]
    public enum StringSplitOptionsEx
    {
    	None = 0,
    	RemoveEmptyEntries = 1,
    	TrimEntries = 2,
    	ReturnSepapator = 4
    }
    
    public static class StringExtensions
    {
    	private readonly static string[] StringSplitOptionsNames = Enum.GetNames<StringSplitOptions>();
    
    	public static string[] Split(this string str, char separator, StringSplitOptionsEx optionsEx = StringSplitOptionsEx.None)
    	{
    		return str.Split(separator.ToString(), optionsEx);
    	}
    
    	public static string[] Split(this string source, string separator, StringSplitOptionsEx optionsEx = StringSplitOptionsEx.None)
    	{
    		if (!optionsEx.HasFlag(StringSplitOptionsEx.ReturnSepapator))
    		{
    			return source.Split(separator, (StringSplitOptions)optionsEx);
    		}
    
    		string[] optionsExNames = optionsEx.ToString().Split(',', StringSplitOptions.TrimEntries);
    		StringSplitOptions options = optionsExNames.Intersect(StringSplitOptionsNames).Select(t => Enum.Parse<StringSplitOptions>(t)).Aggregate((a, b) => { return a | b; });
    		string[] result = source.Split(separator, options);
    		if (!optionsEx.HasFlag(StringSplitOptionsEx.ReturnSepapator))
    		{
    			return result;
    		}
    
    		string[] newResult = new string[result.Length * 2 - 1];
    		for (int i = 0; i < result.Length; i++)
    		{
    			newResult[i * 2] = result[i];
    		}
    		for (int i = 0; i < result.Length - 1; i++)
    		{
    			newResult[i * 2 + 1] = separator;
    		}
    		return newResult;
    	}
    
    	public static string[] Split(this string source, char[] separators, StringSplitOptionsEx optionsEx = StringSplitOptionsEx.None)
    	{
    		if (!optionsEx.HasFlag(StringSplitOptionsEx.ReturnSepapator))
    		{
    			return source.Split(separators, (StringSplitOptions)optionsEx);
    		}
    
    		if (optionsEx.HasFlag(StringSplitOptionsEx.RemoveEmptyEntries))
    		{
    			throw new ArgumentException($"{nameof(StringSplitOptionsEx.RemoveEmptyEntries)} and {StringSplitOptionsEx.ReturnSepapator} cannot be used in combination", nameof(optionsEx));
    		}
    
    		string[] optionsExNames = optionsEx.ToString().Split(',', StringSplitOptions.TrimEntries);
    		StringSplitOptions options = optionsExNames.Intersect(StringSplitOptionsNames).Select(t => Enum.Parse<StringSplitOptions>(t)).Aggregate((a, b) => { return a | b; });
    		string[] result = source.Split(separators, options);
    
    		char[] separatorValues = new char[result.Length - 1];
    		int foundCount = 0;
    		for (int i = 0; i < source.Length; i++)
    		{
    			for (int j = 0; j < separators.Length; j++)
    			{
    				if (source[i] == separators[j])
    				{
    					separatorValues[foundCount] = separators[j];
    					foundCount++;
    					break;
    				}
    			}
    		}
    
    		string[] newResult = new string[result.Length * 2 - 1];
    		for (int i = 0; i < result.Length; i++)
    		{
    			newResult[i * 2] = result[i];
    		}
    		for (int i = 0; i < result.Length - 1; i++)
    		{
    			newResult[i * 2 + 1] = separatorValues[i].ToString();
    		}
    		return newResult;
    	}
    }
    
    output1: 
    A
    |
    B
    |
     
    |
    C
    |
    D
    
    EEEE
    
    output2:
    A
    |
    B
    |
    C
    |
    D
    

    作者:VAllen
    出处:http://www.cnblogs.com/vallen
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    唯有偏执者得以生存。
  • 相关阅读:
    c++检测本机网络
    ShellExecuteEx 阻塞和异步调用进程的两种方法
    QImage 转base64
    C 位域运算
    Linq 取差集 交集等
    Linq 筛选出一条数据
    Linq查询出结果集中重复数据
    使AspNetPager控件中文显示分页信息
    C盘瘦身,可以让你的电脑C盘恢复到刚安装时的大小
    Linq Distinct List 去重复
  • 原文地址:https://www.cnblogs.com/VAllen/p/StringExtensions.html
Copyright © 2011-2022 走看看