Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Разобрать строку (распарсить)

28.11.2016, 11:08. Показов 7912. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, как можно правильно распарсить строку приерного вида?
msg = "temp1 = 25C, temp2=33, humidity = 85, light level = 57 \r";

Делаю вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 [STAThread]
        private void DisplayLabelData(MessageType type, string msg)
        {
           
            string [] separatedCommaMessage = msg.Split(new char[] { ',' });
 
            lbInsideTemperature.Invoke(new EventHandler(delegate
            {
                if (comPort.IsOpen)
                {
                    lbInsideTemperature.Text = string.Empty;
                    lbInsideTemperature.Font = new Font(lbInsideTemperature.Font, FontStyle.Bold);
                    lbInsideTemperature.ForeColor = MessageColor[(int)type];
                    foreach (string s in separatedCommaMessage)
                           lbInsideTemperature.Text = s;
                                       
                }
                // Если порт закрыт, очищаем поле;
                else lbInsideTemperature.Text = string.Empty;
            }));
В итоге у меня выводится в лейбл не первая подстрока, а вторая temp2=33

Добавлено через 5 минут
Либо последняя....
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2016, 11:08
Ответы с готовыми решениями:

Распарсить строку
Суть вопроса такова, есть тест: MyName is: Brain So, bla bla Мне нужно спарсить Brain

Распарсить строку
Доброго времени суток. У меня есть строка вида: "{var1}{var2}const1{var3}const2" Мне нужно её распарсить и получить на выходе {var1} ...

Распарсить строку
Здравствуйте подскажите пожалуйста регулярное выражение для того чтобы распарсить строку вида : ...

35
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
28.11.2016, 14:31
Студворк — интернет-сервис помощи студентам
Jman, не нужно очищать содержимое метки перед записью в неё:

C#
1
lbInsideTemperature.Text = string.Empty;
Это совершенно бессмысленное действие.

И полученное значение температуры не нужно из текста перегонять в число, а потом снова в текст, чтобы просто его в метке вывести:

C#
1
inTemp = Int32.Parse(match.Groups[1].Value);
Я это примера ради привёл. Если в вычислениях данное значение не используется, то можно возвращать строку, как есть.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2016, 14:44  [ТС]
Так оставить? Это в консоле прогон.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 static string ParseInsideTemperature(string msg)
        {
            string inTemp =" ";
 
            Regex intReg = new Regex("temp1[\\s]?=[\\s]?([\\d]+)");
            Match match = intReg.Match(msg);
 
            if (match.Success)
            {
                inTemp = match.Groups[1].Value;
            }
            return inTemp;
        }
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
28.11.2016, 14:55
Jman,

C#
1
2
3
4
5
6
7
 static string ParseInsideTemperature(string msg)
        {
            Regex intReg = new Regex("temp1[\\s]?=[\\s]?([\\d]+)");
            Match match = intReg.Match(msg);
 
            return match.Success ? match.Groups[1].Value : String.Empty;
        }
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2016, 14:56  [ТС]
Зачем очищать в тернарном условии?
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
28.11.2016, 14:57
Jman, там нет никакой очистки. Возвращается либо результат разбора строки, либо пустая строка.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2016, 22:06  [ТС]
Как теперь все в делегат запихнуть... В коде в методе ведь он относится непосредственно к
C#
1
lbInsideTemperature.Invoke(new EventHandler(delegate
Я же не могу туда засунуть свойства и значение остальных лейблов?

Добавлено через 27 минут
Чет я совсем запутался.
C#
1
2
3
4
5
6
7
8
9
Label Lb = new Label();
 
 Lb.Invoke(new EventHandler(delegate
            {
                lbInsideTemperature.Text = ParseInsideTemperature(msg);
                lbOutsideTemperature.Text = ParseOutsideTemperature(msg);
                lbHumidityLevel.Text = ParseHumidity(msg);
                lbLightLevel.Text = ParseLightLevel(msg);
            }));
Вылетает exeption;

Добавлено через 5 часов 35 минут
Помогите пожалуйста с делегатом...
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
29.11.2016, 00:04
Jman, вот это:
C#
1
Label Lb = new Label ();
делать не нужно, используйте метод Invoke у самой формы:
C#
1
2
3
4
this.Invoke (new EventHandler (delegate
{
   // ...
}));
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.11.2016, 09:37  [ТС]
Цитата Сообщение от bax_tang Посмотреть сообщение
делать не нужно, используйте метод Invoke у самой формы:
Код в отдельном классе.

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll
Дополнительные сведения: Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.
Класс наследовал от формы:
C#
1
class CommunicationManager : Form
Код:
C#
1
2
3
4
5
6
7
this.Invoke(new EventHandler(delegate
            {
                lbInsideTemperature.Text = recievedStrFromComPort.ParseInsideTemperature(msg);
                lbOutsideTemperature.Text = recievedStrFromComPort.ParseOutsideTemperature(msg);
                lbHumidityLevel.Text = recievedStrFromComPort.ParseHumidity(msg);
                lbLightLevel.Text = recievedStrFromComPort.ParseLightLevel(msg);
            }));
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
29.11.2016, 09:55
Jman, в каком месте твоего CommunicationManager происходит вызов Invoke()?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.11.2016, 10:07  [ТС]
Класс
C#
1
 class CommunicationManager : Form
Метод:
C#
1
2
3
4
5
6
7
8
9
10
11
 [STAThread]
      private void DisplayLabelData(MessageType type, string msg)
{
this.Invoke(new EventHandler(delegate
            {
                lbInsideTemperature.Text = recievedStrFromComPort.ParseInsideTemperature(msg);
                lbOutsideTemperature.Text = recievedStrFromComPort.ParseOutsideTemperature(msg);
                lbHumidityLevel.Text = recievedStrFromComPort.ParseHumidity(msg);
                lbLightLevel.Text = recievedStrFromComPort.ParseLightLevel(msg);
            }));
}
MessageType - это перечисление для текста в консоли (+ цвет сообщений формируется в массиве):
C#
1
public enum MessageType { Incoming, Outgoing, Normal, Warning, Error, Closed };
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
29.11.2016, 10:26
Jman, DisplayLabelData() вызывается после конструктора формы?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.11.2016, 10:29  [ТС]
После - этот метод в классе CommunicationManager
C#
1
 public CommunicationManager()
Класс
C#
1
2
3
4
5
6
7
8
  public partial class frmMain : Form
    {
        CommunicationManager comm = new CommunicationManager();
        string transType = string.Empty;
        public frmMain()
        {
            InitializeComponent();
        }
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
29.11.2016, 10:33
Jman, ты сказал, что CommunicationManager унаследован от формы. Где, в коде этого класса происходит вызов DisplayLabelData()?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.11.2016, 11:55  [ТС]
C#
1
 public partial class frmMain : Form
Событие на кнопку, открыть порт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
  private void cmdOpen_Click(object sender, EventArgs e)
        {
            comm.Parity = cboParity.Text;
            comm.StopBits = cboStop.Text;
            comm.DataBits = cboData.Text;
            comm.BaudRate = cboBaud.Text;
            comm.DisplayWindow = rtbDisplay;
            comm.DisplayTelemetry = insideTemp;  // Вот один из лейблов. Тут видимо что-то делаю неправильно.
            comm.OpenPort();
            cmdOpen.Enabled = false;
            cmdClose.Enabled = true;
            cmdSend.Enabled = true;
        }
В классе CommunicationManager

C#
1
2
3
4
5
 public Label DisplayTelemetry
        {
            get { return lbInsideTemperature; }
            set { lbInsideTemperature = value; }
        }
Аксессор только для одного лейбла =))))

Добавлено через 1 час 18 минут
CommunicationManager, сделал так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 public Label DisplayInsideTemp
        {
            get { return lbInsideTemperature; }
            set { lbInsideTemperature = value; }
        }
 
        public Label DisplayOutsideTemp
        {
            get { return lbOutsideTemperature; }
            set { lbOutsideTemperature = value; }
        }
 
        public Label DisplayHumidity
        {
            get { return lbHumidityLevel; }
            set { lbHumidityLevel = value; }
        }
 
        public Label DisplayLightLevel
        {
            get { return lbLightLevel; }
            set { lbLightLevel = value; }
        }
 
 
[STAThread]
      private void DisplayLabelData(MessageType type, string msg)
{
this.Invoke(new EventHandler(delegate
            {
                lbInsideTemperature.Text = recievedStrFromComPort.ParseInsideTemperature(msg);
                lbOutsideTemperature.Text = recievedStrFromComPort.ParseOutsideTemperature(msg);
                lbHumidityLevel.Text = recievedStrFromComPort.ParseHumidity(msg);
                lbLightLevel.Text = recievedStrFromComPort.ParseLightLevel(msg);
            }));
}
Тут
C#
1
public partial class frmMain : Form
сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void cmdOpen_Click(object sender, EventArgs e)
        {
            comm.Parity = cboParity.Text;
            comm.StopBits = cboStop.Text;
            comm.DataBits = cboData.Text;
            comm.BaudRate = cboBaud.Text;
            comm.DisplayWindow = rtbDisplay;
            comm.DisplayInsideTemp = insideTemp;
            comm.DisplayOutsideTemp = outsideTemp;
            comm.DisplayHumidity = huMidity;
            comm.DisplayLightLevel = lightLevel;
            comm.OpenPort();
            cmdOpen.Enabled = false;
            cmdClose.Enabled = true;
            cmdSend.Enabled = true;
        }
Вывод - тот же эксепшн... =( Может сам проект скинуть?
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,045
29.11.2016, 12:08
Jman, не наследуй свой CommunicationManager от формы. Это, ведь, не форма, а сервис чтения данных из COM-порта. Ну я так понял, по-крайней мере. Замени метод DisplayLabelData() на событие, в этом событие передавай аргумент - специальный класс со свойствами, в которые записывай полученные (и распаршенные) данные из порта. В коде основной формы подпишись на это событие и уже там вызывай Invoke.

Короче, причеши этот бардак.
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.11.2016, 12:11  [ТС]
Ок. Буду пробовать. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2016, 12:11

Распарсить строку
Здравствуйте ув.форумчани! Помогите пожалуйста с регуляркой. Имеется вот такой вот текст: <table...

Распарсить строку
String s = "`user999` | 1882 "; string pattern = @"(\d)+"; RegexOptions option = RegexOptions.IgnoreCase; ...

Распарсить строку
Всем вечер добрый, господа. Есть такая беда. Есть строка. И она меняется(!)...Однако символы ( & И ; - не меняются.) Допустим...

Распарсить строку
Доброго времени суток, подскажите как можно распарсить следующую строку ...

Как распарсить строку?
Всем привет! У меня есть строка: <div class="work-info"> <!----> <!----><div class="work-description break-text"...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru