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;
        }
    }