Какое регулярное выражение использовать, что бы достать все подстроки начинающиеся с одного слова?
Есть например строка:
{\"Mesmes\":khdfskhfkjshadfjh{}ds{jaf8674535}234}{\"Mesmes\":hhTTY7{864938}523_{}jhg{dfsRRRRRRR}}
Какое регулярное выражение использовать, что бы разделить это на подстроки начинающиеся с {\"Mesmes\":
Не силён в регулярных выражениях, поэтому обращаюсь к знатокам.
Если нужно просто разделить, то подойдёт и string.Split();
А вообще, парсить JSON регулярками, когда есть нормальные парсеры как-то странно, по меньшей мере.
1) Split не подойдёт тут.
2) Это не совсем нормальный json. Проблема в том, что это несколько объектов json в одной строке. И это не массив. Так что JsonConvert.DeserializeObject не может отпарсить такую строку
using System;
class SplitDemo {
static void Main() {
var src = "{\"Mesmes\":khdfskhfkjshadfjh{}ds{jaf8674535}234}{\"Mesmes\":hhTTY7{864938}523_{}jhg{dfsRRRRRRR}}";
var parts = src.Split(new string[] { "{\"Mesmes\":" }, StringSplitOptions.None);
foreach(var part in parts)
{
Console.WriteLine(part);
}
}
}
cicatrix, а затем снова в начало строки добавлять {\"Mesmes\": ?
Была у меня такая мысть, но почему то я посчитал что это как то криво... Думал можно как то красивее сделать, регулярными выражениями.
Иоанн, Так и регулярка тебе выдаст отдельные группы. Только её ещё задолбаешься писать, потому что непонятно, чем терминируется значение.
Будет дольше и более громоздко.
Если не хочешь Split, используй IndexOf
Кто вам отдает такой кривой JSON? Если Ваш сервис, то советую его переписать, чтобы он выдавал валидный JSON. С ним работать куда приятнее.
Присоединяюсь к комментарию cicatrix
Пока не могу придумать как решить эту проблему. Сервер асинхронно обрабатывает данные и отправляет их клиентам, а так же отвечает на запросы клиентов. И иногда получается так, что когда сервер отправляет несколько сообщений подряд одному клиенту, а они приходят как одно. Пока не придумал как это решить, и как сообщить что это разные сообщения, по этому ищу "костыль".
Была мысль отправлять длину письма, но не думаю что это хорошая идея. Всё равно делить придётся то что пришло.
Иоанн, думаю, что нужно решать эту проблему, а не её следствие. Лучше показать код, как эти сообщения отправляются и попробовать решить проблему. В идеале лучше набросать отдельный проект с демонстрацией проблемы. Зачем? Если кому-то станет интересно, он даже сможет её исправить, запустив у себя на компьютере. Но пытаться парсить невалидные данные... Даже не знаю. А где гарантия, что эти невалидные данные всегда будут в таком виде? Вполне может измениться их формат и что тогда? Писать новый парсер на каждый баг? Первое от чего нужно отказаться - это от наслоения багов и проблем на будущее.
Борис Животное, я бы с радостью, что бы кто то подсказал решение.
По поводу отправки сервером всё просто: есть Socket clSocket на сервере. clSocket.Send(Encoding.UTF8.GetBytes(message));
Вот так клиент получает сообщения:
private void Read()
{
string message;
int stopInd;
List<byte[]> buffer = new List<byte[]>();
buffer.Add(new byte[512]);
var ii = 0;
byte[] newbufer;
//пока флаг установлен...
while (Connected)
{
int i = 0;
//чтение данных с сервера
try
{
i = clSocket.Receive(buffer[ii]);
var ava = clSocket.Available;
if(ava > 0)
{
newbufer = new byte[ava+1];
ii = 1;
buffer.Add(newbufer);
continue;
}
}
//если любая ошибка - остановка и переподключение
catch (SocketException e)
{
EventVisualLog((int)ClientConnectorCodeCon.ERRCONNECT, e.ToString());
Stop(e, ClientConnectorCodeCon.ERRORLIST);
timer.Start();
return;
}
//если принятых байт больше нуля
if (i > 0)
{
//получение строки
var buf = ConvertToByteArray(buffer);
message = Encoding.UTF8.GetString(buf);
EventVisualLog((int)ClientConnectorCodeCon.CONNECT, "Получил сообщение от сервера: " + message);
try
{
//нахождение индекса окончания строки
stopInd = message.IndexOf("\0");
// выделение сообщения
message = message.Substring(0, stopInd);
// активация СОБЫТИЯ, что пришло сообщение от сервера
EventReciveMessage(message);
}
catch { }
//обнуление буфера
buffer = new List<byte[]>();
buffer.Add(new byte[512]);
ii = 0;
}
else
{
timer.Start();
Stop(new Exception("Сервер разорвал соединение"), ClientConnectorCodeCon.DISCONNECT);
}
}
}
Иоанн, что ты предлагаешь мне делать с этим методом? Обучиться на исходниках со всего гитхаба и как нейронная сеть достроить недостающие части проекта? В общем, нагугли просто передачу данных сокетами от сервера клиенту и обратно. Возьми нормальный рабочий код и используй.
Буферы ты так себе обнуляешь. Попробуй использовать ArrayPool{T}. Использовать и совободждать его нужно через try finally, а не как в кхм... гно... кхы... примерах в интернете.