我也遇到了这个问题,没有找到解决办法。所以我自己写了这样一个方法:
public static IEnumerable<string> Split(
this string text,
char separator,
char escapeCharacter)
{
var builder = new StringBuilder(text.Length);
bool escaped = false;
foreach (var ch in text)
{
if (separator == ch && !escaped)
{
yield return builder.ToString();
builder.Clear();
}
else
{
// separator is removed, escape characters are kept
builder.Append(ch);
}
// set escaped for next cycle,
// or reset unless escape character is escaped.
escaped = escapeCharacter == ch && !escaped;
}
yield return builder.ToString();
}
它与 Escape 和 Unescape 结合使用,后者转义分隔符和转义字符并再次删除转义字符:
public static string Escape(this string text, string controlChars, char escapeCharacter)
{
var builder = new StringBuilder(text.Length + 3);
foreach (var ch in text)
{
if (controlChars.Contains(ch))
{
builder.Append(escapeCharacter);
}
builder.Append(ch);
}
return builder.ToString();
}
public static string Unescape(string text, char escapeCharacter)
{
var builder = new StringBuilder(text.Length);
bool escaped = false;
foreach (var ch in text)
{
escaped = escapeCharacter == ch && !escaped;
if (!escaped)
{
builder.Append(ch);
}
}
return builder.ToString();
}
逃逸/逃逸的例子
separator = ','
escapeCharacter = '\\'
//controlCharacters is always separator + escapeCharacter
@"AB,CD\EF\," <=> @"AB\,CD\\EF\\\,"
分裂:
@"AB,CD\,EF\\,GH\\\,IJ" => [@"AB", @"CD\,EF\\", @"GH\\\,IJ"]
所以要使用它,Escape before Join 和 Unescape after Split。