Можно ли от названии объекта вырезать другое название?

 

Добрый день, ребят прошу помочь:

имеется строчка, в которой name,  это название OBJ_RECTANGLE_LABEL, например: PKZON_2022.03.15 00:00:00_L_344

            ObjectSet(name, OBJPROP_COLOR, ListColor[i]); // PKZON_2022.03.15 00:00:00_L_344

Мне с имени нужно вырезать вот эту часть:   (например:  _L_344, дабы получилось  PKZON_2022.03.15 00:00:00)

(string)InffO[i].NKZ   // _L_344


как получить что-то типо такого?

            ObjectSet(name- (string)InffO[i].NKZ, OBJPROP_COLOR, ListColor[i]);

Спасибо, за потраченное время
 
vebster005:

Добрый день, ребят прошу помочь:

имеется строчка, в которой name,  это название OBJ_RECTANGLE_LABEL, например: PKZON_2022.03.15 00:00:00_L_344

Мне с имени нужно вырезать вот эту часть:   (например:  _L_344, дабы получилось  PKZON_2022.03.15 00:00:00)


как получить что-то типо такого?


Спасибо, за потраченное время

если имя типа 

_L_344

то с вероятностью 99.99% у вас в руках старинный декомпил, и стоит бросить бяку

 
vebster005:

Добрый день, ребят прошу помочь:

имеется строчка, в которой name,  это название OBJ_RECTANGLE_LABEL, например: PKZON_2022.03.15 00:00:00_L_344

Мне с имени нужно вырезать вот эту часть:   (например:  _L_344, дабы получилось  PKZON_2022.03.15 00:00:00)


Если длина строки типа _L_344 постоянная (6 символов), то вообще просто:

StringSubstr(name, 0, StringLen(name) - 6);

Если же длина изначально неизвестна, то придется определить ее. Для этого придется распарсить исходную строку, чтобы выделить ту часть, которую необходимо удалить.

Парсер можно написать свой (если нет постоянного символа-разделителя), а можно использовать StringSplit, если символ-разделитель в строке является постоянным.

 
Ihor Herasko #:

Если длина строки типа _L_344 постоянная (6 символов), то вообще просто:

Если же длина изначально неизвестна, то придется определить ее. Для этого придется распарсить исходную строку, чтобы выделить ту часть, которую необходимо удалить.

Парсер можно написать свой (если нет постоянного символа-разделителя), а можно использовать StringSplit, если символ-разделитель в строке является постоянным.

Спасибо за ответ, а если меняется значение, как быть?



Пожалуйста подскажите что можно сделать еще?
 
Maxim Kuznetsov #:

если имя типа 

то с вероятностью 99.99% у вас в руках старинный декомпил, и стоит бросить бяку

вы возможно правы, но я не создаю что-то глобальное, а всего лишь учусь)

 
vebster005 #:

вы возможно правы, но я не создаю что-то глобальное, а всего лишь учусь)

Ну если вы учитесь, то прочтите эту страницу и вы поймёте больше, чем вам объяснят все вместе на 3-4 форумах.

Ну, а если ничего не поймёте, то «не царское это дело…»

Документация по MQL5: Строковые функции
Документация по MQL5: Строковые функции
  • www.mql5.com
Строковые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
vebster005 #:

Спасибо за ответ, а если меняется значение, как быть?

В смысле не значение меняется, а длина? Для такого случая нужно знать, что именно искать. То есть должен быть какой-то признак, по которому можно определить, что от исходной строки следует отделить какую-то часть. Обычно это обыгрывается разделителями типа символов "_", ";", " " (пробел). Если такого нет, то тогда в принципе непонятно, что же следует искать.
 
Maxim Kuznetsov #:

если имя типа 

то с вероятностью 99.99% у вас в руках старинный декомпил, и стоит бросить бяку

Это в имени графического объекта, никакой связи с декомпилами нет.

 
Ihor Herasko #:
В смысле не значение меняется, а длина? Для такого случая нужно знать, что именно искать. То есть должен быть какой-то признак, по которому можно определить, что от исходной строки следует отделить какую-то часть. Обычно это обыгрывается разделителями типа символов "_", ";", " " (пробел). Если такого нет, то тогда в принципе непонятно, что же следует искать.

ребят спасибо всем за ответы, как можно обгрызть до 2-го разделителя, ну или до 1-го:
Окончание может быть:   _L_* либо  _H_* (за место звездочки может быть любые цифры)

Ребят я прошу прощения, я наверное даже не могу правильно изложить сути вопроса, раз столько случаев может быть

 
    string name = "PKZON_2022.03.15 00:00:00_L_344";
    name = name.Substr(0, name.Find("_", 6));
    Print(name);
 
vebster005 #:

ребят спасибо всем за ответы, как можно обгрызть до 2-го разделителя, ну или до 1-го:
Окончание может быть:   _L_* либо  _H_* (за место звездочки может быть любые цифры)

Если искомая подстрока всегда расположена в конце исходной строки, то так:

   string sName = "PKZON_2022.03.15 00:00:00_H_344";
   int nPos = StringFind(sName, "_L_");
   if (nPos < 0)
      nPos = StringFind(sName, "_H_");
   
   string sNewString = sName;   
   if (nPos >= 0)
      sNewString = StringSubstr(sName, nPos);
      
   Print(sNewString);     // _H_344