C#扩展方法 - 也接受转义字符的字符串拆分

Bud*_*Joe 7 .net c# extension-methods parsing split

我想为.NET String类编写扩展方法.我希望它是Split方法的一个特殊的方法 - 在分隔符之前使用转义字符时,它采用转义字符来防止拆分字符串.

写这个的最好方法是什么?我很好奇最好的非正则表达式来接近它.
像签名一样的东西......

public static string[] Split(this string input, string separator, char escapeCharacter)
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

更新: 因为它出现了一个评论,逃避......

在C#中转义非特殊字符时会出现错误 - CS1009:无法识别的转义序列.

在IE JScript中,转义转义字符.除非你尝试\ u然后你得到一个"预期的十六进制数字"错误.我测试了Firefox,它有相同的行为.

我希望这种方法非常宽容并遵循JavaScript模型.如果你在非分隔符上转义,它应该"善意"删除转义字符.

Jon*_*eet 12

怎么样:

public static IEnumerable<string> Split(this string input, 
                                        string separator,
                                        char escapeCharacter)
{
    int startOfSegment = 0;
    int index = 0;
    while (index < input.Length)
    {
        index = input.IndexOf(separator, index);
        if (index > 0 && input[index-1] == escapeCharacter)
        {
            index += separator.Length;
            continue;
        }
        if (index == -1)
        {
            break;
        }
        yield return input.Substring(startOfSegment, index-startOfSegment);
        index += separator.Length;
        startOfSegment = index;
    }
    yield return input.Substring(startOfSegment);
}
Run Code Online (Sandbox Code Playgroud)

这似乎有用(有一些快速测试字符串),但它不会删除转义字符 - 这将取决于你的确切情况,我怀疑.


Jam*_*ran 7

这将需要清理一下,但这基本上是....

List<string> output = new List<string>();
for(int i=0; i<input.length; ++i)
{
    if (input[i] == separator && (i==0 || input[i-1] != escapeChar))
    {
        output.Add(input.substring(j, i-j);
        j=i;
    }
}

return output.ToArray();
Run Code Online (Sandbox Code Playgroud)