dan*_*sky 9 c# regex algorithm
我有点惊讶的是网上没有关于此的信息,我一直发现这个问题比我想象的要有点棘手.
这是规则:
代码签名(基本上是C#)
public static string[] smartSplit(
string delimitedData,
char delimiter,
char escape) {}
Run Code Online (Sandbox Code Playgroud)
问题中最棘手的部分是转义的连续转义字符大小写,当然,因为(调用/转义字符和分隔符):////////,= ////,
我错过了某个地方,这是在网上还是在另一个SO问题上处理的?如果没有,那就把你的大脑投入工作......我认为这个问题对于公益事业来说是件好事.我自己正在研究它,但还没有一个好的解决方案.
简单的状态机通常是最简单,最快捷的方式.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)
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)