2015-10-05 2 views
0

Как разбить строку на основе пользовательского разделителя, а также убедиться, что строка заканчивается разделителем? Я пытаюсь обрабатывать входящие данные клиента и пытаться разделить сообщения. Но возможно, что клиент отправляет серверу сообщение, состоящее из 3 небольших сообщений, где третье сообщение еще не завершено. т.е. он не содержит разделителя, что означает, что еще впереди.Разделить строку с разделителем при проверке разделителя

Пример

using System; 

public class Test{ 
    private string eofString = "<EOF>"; 
    private string[] eofArray = { "<EOF>" }; 


    public void Main(){ 
     string foo = "bob<EOF>jill<EOF>jake"; 
     string[] splitMessages = foo.Split(eofArray, StringSplitOptions.RemoveEmptyEntries); 
     for(int i = 0; i < splitMessages.Length; i++){ 
      Console.WriteLine(splitMessages[i]); 
     }  
    } 
} 

Выходы

bob 
jill 
jake 

Мой ожидается выход

bob 
jill 

потому что конец строки foo не заканчиваются <EOF>.

Это не так. Я хочу поставить jake в этом случае обратно в построитель строк.

+0

Вопрос не очень ясен. Можете ли вы показать, каков ваш ожидаемый результат. –

ответ

1

Вы можете использовать String.EndsWith, чтобы определить, заканчивается ли строка с помощью разделителя.

+1

Geez, спасибо. Это было легко. – user3822370

0

Вы можете разделить с этим рисунком:

"<EOF>([^\<]*)" 
+2

Как правило, ответы гораздо полезнее, если они содержат объяснение того, что должен делать код, и почему это решает проблему, не представляя других. Это особенно верно для regexen, которые, как известно, являются непрозрачным линейным шумом для большинства. –

0

Если вы хотите, решение на основе регулярных выражений следующий будет работать, как хорошо.

string input = "bob<EOF>jill<EOF>jake"; 
Regex r = new Regex(@"(?<message>.+?)\<EOF\>", RegexOptions.Compiled); 
IEnumerable<string> messages = r.Matches(input).Cast<Match>().Select(i => i.Groups["message"].Value); 

В основном он использует нежадным шаблон матча .+? (1 или более любых символов, соответствие, как несколько символов, насколько это возможно) в пределах названного захваченной группы (?<message> #pattern goes here), который должен быть прекращен с фиксированной строкой <EOF>. Все совпадения находятся в одном «проходе» и просто нужно проецироваться из коллекции совпадений по имени группы захвата.