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

标签 c# .net parsing extension-methods split

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

最好的写法是什么?我很好奇处理它的最佳非正则表达式方法。
带有签名的东西,例如...

public static string[] Split(this string input, string separator, char escapeCharacter)
{
   // ...
}

更新: 因为它出现在一个评论中,转义......

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

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

我希望此方法非常宽容并遵循 JavaScript 模型。如果您在非分隔符上转义,它应该“友好地”删除转义字符。

最佳答案

怎么样:

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

这似乎可行(使用一些快速测试字符串),但它不会删除转义字符 - 我怀疑这将取决于您的具体情况。

关于C# 扩展方法 - 也接受转义字符的字符串拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634777/

相关文章:

c# - 如何判断您是在自己的构造函数中,还是在 C# 中的基类构造函数中

c# - Active Directory 帐户密码到期日期和细粒度密码策略

c# - 为什么反射会为 lambda 返回如此奇怪的名称?

c++ - 为什么 Bison 中的简单语法规则不起作用?

android - 如何使用android检查解析表中的空值?

c# - 用C#在图片上写文字

c# - 图表中的系列颜色在哪个时间点初始化

c# - 当我们从任务管理器中的进程选项卡关闭应用程序时如何获取登录.txt

.net - ScrollViewer 中的列表框

unit-testing - 单元测试 Rust Syn crate