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

dan*_*sky 9 c# regex algorithm

我有点惊讶的是网上没有关于此的信息,我一直发现这个问题比我想象的要有点棘手.

这是规则:

  1. 您将从分隔/转义数据开始拆分为数组.
  2. 分隔符是一个任意字符
  3. 转义字符是一个任意字符
  4. 分隔符和转义字符都可能出现在数据中
  5. 正则表达式很好,但性能最好的解决方案是最好的
  6. 编辑:可以忽略空元素(包括前导或结束分隔符)

代码签名(基本上是C#)

public static string[] smartSplit(
                         string delimitedData, 
                         char delimiter, 
                         char escape) {}
Run Code Online (Sandbox Code Playgroud)

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

我错过了某个地方,这是在网上还是在另一个SO问题上处理的?如果没有,那就把你的大脑投入工作......我认为这个问题对于公益事业来说是件好事.我自己正在研究它,但还没有一个好的解决方案.

sth*_*sth 6

简单的状态机通常是最简单,最快捷的方式.Python中的示例:

def extract(input, delim, escape):
  # states
  parsing = 0
  escaped = 1

  state = parsing
  found = []
  parsed = ""

  for c in input:
    if state == parsing:
      if c == delim:
        found.append(parsed)
        parsed = ""
      elif c == escape:
        state = escaped
      else:
        parsed += c
    else: # state == escaped
       parsed += c
       state = parsing

  if parsed:
    found.append(parsed)

  return found
Run Code Online (Sandbox Code Playgroud)


Ken*_*enE 5

void smartSplit(string const& text, char delim, char esc, vector<string>& 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);
}
Run Code Online (Sandbox Code Playgroud)