字符串分割(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章