2010-10-06 7 views
1

Я написал эту функцию ...Как сделать эту функцию не досрочно расколотой?

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 хочу, чтобы он был т на пространстве.

Как исправить эту функцию?

+2

Сделать несколько булевых «был разбит на последний символ» и не разделить, если он установлен. Это разделило бы 'a> b' на' a' и '> b', что не хочется, я думаю. Но если нет, вы хотите, чтобы 'a> b' был разделен на' a 'и' b'? А как насчет 'a>> b'? –

+0

Да, я хочу, чтобы 'a> b' делился на' a' и 'b'. 'a>> b' недействительный ввод в моем синтаксисе, поэтому мне все равно, что происходит в этом сценарии (может быть только один разделительный символ между« частями », за исключением пробелов) – mpen

ответ

0

Вы можете продолжить разделение на основе и >, а затем удалить пустые строки.

+0

Проблема с этим: что ему нужно вернуть '>' как часть «KeyValuePair», а не пробел. – mpen

+0

Как насчет удаления пробелов, которые появляются до и после других разделителей? a> b становится a> b и ab остается как ab – Prashast

+1

Я думал об этом, но проблема в том, что пробелы в цитируемых строках, такие как '' a> b "' значительны и не должны быть удалены (или разделены) , – mpen

0

Я думаю, что это делает его ...

internal static IEnumerable<KeyValuePair<char?, string>> SplitUnescaped(this string input, char[] separators) 
{ 
    int startIndex = 0; 
    var state = new Stack<char>(); 
    input = input.Trim(separators); 

    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); 
     else if (state.Count == 0 && separators.Contains(c)) 
     { 
      int endIndex = i; 
      while (input[i] == ' ' && separators.Contains(input[i + 1])) { ++i; } 
      yield return new KeyValuePair<char?, string>(input[i], input.Substring(startIndex, endIndex - startIndex)); 
      while (input[++i] == ' ') { } 
      startIndex = i; 
     } 
    } 

    yield return new KeyValuePair<char?, string>(null, input.Substring(startIndex)); 
} 

Я пытался подтолкнуть пространство на стек слишком раньше, а затем делать некоторые проверки, что ... но я думаю, что это проще.

+0

В этом тоже есть ошибка ... здесь функция будет храниться здесь http://code.google.com/p/sharp-query/source/browse/trunk/SharpQuery/SharpQuery2/SharpQuery.cs#74. по крайней мере, на некоторое время. – mpen