在C#的Split中逃避角色()

时间:2015-10-02 11:43:11

标签: c# string split escaping

我正在解析一些分隔符分隔值,其中?被指定为转义字符,以防分隔符作为其中一个值的一部分出现。

例如:如果:是分隔符,而某个字段的值为19:30,则需要将其写为19?:30

目前,我使用string[] values = input.Split(':');来获取所有值的数组,但在了解了这个转义字符后,这将不再有效。

有没有办法让Split考虑转义字符?我检查了重载方法,似乎没有直接这样的选项。

3 个答案:

答案 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;的行为方式)。在最坏的情况下,我认为您必须手动进行解析。