我正在解析一些分隔符分隔值,其中?
被指定为转义字符,以防分隔符作为其中一个值的一部分出现。
例如:如果:
是分隔符,而某个字段的值为19:30
,则需要将其写为19?:30
。
目前,我使用string[] values = input.Split(':');
来获取所有值的数组,但在了解了这个转义字符后,这将不再有效。
有没有办法让Split
考虑转义字符?我检查了重载方法,似乎没有直接这样的选项。
答案 0 :(得分:10)
string[] substrings = Regex.Split("aa:bb:00?:99:zz", @"(?<!\?):");
的
aa
bb
00?:99
zz
或者你可能想要unescape?:在某些时候,用另一个令牌替换输入中的序列,拆分并替换回来。
(这需要使用System.Text.RegularExpressions
命名空间。)
答案 1 :(得分:1)
这种东西在不使用 Regex 的情况下编码总是很有趣。
以下是一个警告的诀窍:转义字符将总是转义,它没有逻辑来仅检查有效的: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;
}
}
。
{{1}}
答案 2 :(得分:-1)
不,没有办法做到这一点。您将需要使用正则表达式(这取决于您希望&#34;转义字符&#34;的行为方式)。在最坏的情况下,我认为您必须手动进行解析。