一尘不染

任意定界符/转义字符处理的最佳算法是什么?

algorithm

我有点惊讶,因为网上没有关于此的任何信息,
而且我一直发现问题比我想象的要棘手。

规则如下:

  1. 您将从定界/转义的数据分割成一个数组开始。
  2. 分隔符是一个任意字符
  3. 转义字符是一个任意字符
  4. 分隔符和转义符都可能出现在数据中
  5. 正则表达式很好,但是性能好的解决方案是最好的
  6. 编辑:空元素(包括前导或结尾定界符)可以忽略
    代码签名(在C#中基本上是)

    public static string[] smartSplit(
    string delimitedData,
    char delimiter,
    char escape) {}

当然,问题的最棘手的部分是转义的连续转义字符大小写,因为(调用/转义字符和,分隔符):
///////,= ////,

我是否想在网上或其他SO问题中解决此问题?
如果没有,那就动脑筋了……我认为这个问题
对于公共利益来说是很好的。我自己在做,但是
还没有一个好的解决方案。


阅读 313

收藏
2020-07-28

共1个答案

一尘不染

void smartSplit(string const& text, char delim, char esc, vector& tokens)
{
enum State { NORMAL, IN_ESC };
State state = NORMAL;
string frag;

    for (size_t i = 0; i<text.length(); ++i)
    {
        char c = text[i];
        switch (state)
        {
        case NORMAL:
            if (c == delim)
            {
                if (!frag.empty())
                    tokens.push_back(frag);
                frag.clear();
            }
            else if (c == esc)
                state = IN_ESC;
            else
                frag.append(1, c);
            break;
        case IN_ESC:
            frag.append(1, c);
            state = NORMAL;
            break;
        }
    }
    if (!frag.empty())
        tokens.push_back(frag);
}
2020-07-28