Я написал эту функцию ...Как сделать эту функцию не досрочно расколотой?
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
I do хочу, чтобы он был т на пространстве.
Как исправить эту функцию?
Сделать несколько булевых «был разбит на последний символ» и не разделить, если он установлен. Это разделило бы 'a> b' на' a' и '> b', что не хочется, я думаю. Но если нет, вы хотите, чтобы 'a> b' был разделен на' a 'и' b'? А как насчет 'a>> b'? –
Да, я хочу, чтобы 'a> b' делился на' a' и 'b'. 'a>> b' недействительный ввод в моем синтаксисе, поэтому мне все равно, что происходит в этом сценарии (может быть только один разделительный символ между« частями », за исключением пробелов) – mpen