C# 的 Split() 中的转义字符
Escape character in C#'s Split()
我正在解析一些分隔符分隔的值,其中 ?
被指定为转义字符,以防分隔符作为其中一个值的一部分出现。
例如:如果:
是分隔符,某个字段的值为19:30
,则需要写成19?:30
.
目前,我使用 string[] values = input.Split(':');
来获取所有值的数组,但在了解了这个转义字符后,这将不再有效。
有没有办法让 Split
考虑转义字符?重载的方法我都查过了,好像没有直接这样的选项。
string[] substrings = Regex.Split("aa:bb:00?:99:zz", @"(?<!\?):");
为了
aa
bb
00?:99
zz
或者你可能想要取消转义?:在某个时候,用另一个标记替换输入中的序列,拆分并替换回去。
(这需要使用 System.Text.RegularExpressions
命名空间。)
不,没有办法做到这一点。您将需要使用正则表达式(这取决于您希望 "escape character" 的行为方式)。在最坏的情况下,我想你必须手动进行解析。
这种东西在不使用 Regex 的情况下编写代码总是很有趣。
下面的技巧只需要一个警告:转义字符 总是 转义,它没有逻辑只检查 valid 个:?;
。所以字符串 one?two;three??;four?;five
会被拆分为 onewo
, three?
, fourfive
.
public static IEnumerable<string> Split(this string text, char separator, char escapeCharacter, bool removeEmptyEntries)
{
string buffer = string.Empty;
bool escape = false;
foreach (var c in text)
{
if (!escape && c == separator)
{
if (!removeEmptyEntries || buffer.Length > 0)
{
yield return buffer;
}
buffer = string.Empty;
}
else
{
if (c == escapeCharacter)
{
escape = !escape;
if (!escape)
{
buffer = string.Concat(buffer, c);
}
}
else
{
if (!escape)
{
buffer = string.Concat(buffer, c);
}
escape = false;
}
}
}
if (buffer.Length != 0)
{
yield return buffer;
}
}
我正在解析一些分隔符分隔的值,其中 ?
被指定为转义字符,以防分隔符作为其中一个值的一部分出现。
例如:如果:
是分隔符,某个字段的值为19:30
,则需要写成19?:30
.
目前,我使用 string[] values = input.Split(':');
来获取所有值的数组,但在了解了这个转义字符后,这将不再有效。
有没有办法让 Split
考虑转义字符?重载的方法我都查过了,好像没有直接这样的选项。
string[] substrings = Regex.Split("aa:bb:00?:99:zz", @"(?<!\?):");
为了
aa
bb
00?:99
zz
或者你可能想要取消转义?:在某个时候,用另一个标记替换输入中的序列,拆分并替换回去。
(这需要使用 System.Text.RegularExpressions
命名空间。)
不,没有办法做到这一点。您将需要使用正则表达式(这取决于您希望 "escape character" 的行为方式)。在最坏的情况下,我想你必须手动进行解析。
这种东西在不使用 Regex 的情况下编写代码总是很有趣。
下面的技巧只需要一个警告:转义字符 总是 转义,它没有逻辑只检查 valid 个:?;
。所以字符串 one?two;three??;four?;five
会被拆分为 onewo
, three?
, fourfive
.
public static IEnumerable<string> Split(this string text, char separator, char escapeCharacter, bool removeEmptyEntries)
{
string buffer = string.Empty;
bool escape = false;
foreach (var c in text)
{
if (!escape && c == separator)
{
if (!removeEmptyEntries || buffer.Length > 0)
{
yield return buffer;
}
buffer = string.Empty;
}
else
{
if (c == escapeCharacter)
{
escape = !escape;
if (!escape)
{
buffer = string.Concat(buffer, c);
}
}
else
{
if (!escape)
{
buffer = string.Concat(buffer, c);
}
escape = false;
}
}
}
if (buffer.Length != 0)
{
yield return buffer;
}
}