我已经写了这个功能...如何使这个功能不会过早拆分?
internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators)
{
int index = 0;
var state = new Stack<char>();
for (int i = 0; i < input.Length; ++i)
{
char c = input[i];
char s = state.Count > 0 ? state.Peek() : default(char);
if (state.Count > 0 && (s == '\\' || (s == '[' && c == ']') || ((s == '"' || s == '\'') && c == s)))
state.Pop();
else if (c == '\\' || c == '[' || c == '"' || c == '\'')
state.Push(c);
if (state.Count == 0 && separators.Contains(c))
{
yield return new KeyValuePair<char?, string>(c, input.Substring(index, i - index));
index = i + 1;
}
}
yield return new KeyValuePair<char?, string>(null, input.Substring(index));
}
,因为他们没能逃脱,引号,或者括号其将在给定的分隔字符串,只要。似乎工作得很好,但它有一个问题。
有字符我想拆就包括空间:
{ '>', '+', '~', ' ' };
因此,考虑到字符串
a > b
我想它拆就>
而忽略了空间,但鉴于
a b
我做想要它spli在空间上。
我该如何修复这个功能?
做一些布尔“最后一个字符有分裂”,如果它被设置不分裂。那会把'a> b'分成'a'和'> b'这不是你想要的。但是,如果不是,你想'a> b'被分割为'a'和'b'?那么'a>> b'呢? – 2010-10-06 07:24:08
是的,我想'a> b'分成'a'和'b'。 'a>> b'在我的语法中不是有效的输入,所以我真的不在乎这种情况会发生什么(除了空格之外,只能有'部分'之间的一个分隔字符) – mpen 2010-10-06 07:30:58