EDIT:
Глядя на другие ответы, это, вероятно, просто декоративная ценность.
Решение @Jan и @ ThymosK
var packets = Regex.Split(buffer, @"AK\d{2}[01]");
кажется гораздо более элегантным.
Но я думаю, что было бы неплохо увидеть, как весь синтаксический анализ может быть перемещен внутри регулярного выражения. Даже если это слишком нечитаемо: P
Я разработал регулярное выражение, которое может давать вам сообщения и разделители в виде групп:
(?s)(AK[0-9][0-9][0,1])|((?:(?!AK[0-9][0-9][0,1]).)*)
Он может анализировать текст следующим образом:
Вы можете проверить это здесь .
Как обычно, регулярные выражения только для записи. Я вряд ли могу прочитать это сам. Но я постараюсь пройти через это:
Первая группа проста и просто ловит вашу команду подтверждения:
(AK[0-9][0-9][0,1])
Вторая группа содержит отрицательный прогноз (?! ... )
, который соответствует чему-либо, за чем не следует регулярное выражение, заданное ...
. Здесь мы вставляем ваш синтаксис ack
, поэтому все, за чем не следует ack
, сопоставляется. Затем мы добавляем один символ, чтобы расширить его, чтобы он соответствовал чему угодно до ack
.
По сути, эта вторая часть утверждает, что в настоящее время мы не следуем ack
, а затем добавляем один символ. Это повторяется как можно дольше, пока мы не найдем ack
. Я превращаю это во вторую группу.
Поскольку в настоящее время у меня нет C #, я не могу обернуть это в код с помощью движка C # regex. Но python прекрасно работает с ним и предлагает полезный метод findall, который дает вам все эти группы.