Имя: Пароль:
1C
 
Существует ли в БСП процедура распарсить строку?
,
0 evorle145
 
13.12.23
10:47
найти все параметры в строке, которые обернуты, допустим в такие кавычки {{}}

Вход:
10+{{TAB}}  * RATE(Строка,PARENT({{KILL}},,1) ,2) /100
Выход:
TAB
KILL

могу, конечно, свою написать, но вряд ли получится лучше чем универсальная из БСП, если таковая есть...
1 Волшебник
 
13.12.23
10:49
СтрНайтиПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>). Находит в указанной строке вхождения подстрок, соответствующих заданному регулярному выражению.

Планируется в версии 8.3.23

https://wonderland.v8.1c.ru/blog/podderzhka-regulyarnykh-vyrazheniy-vo-vstroennom-yazyke/
2 SleepyHead
 
гуру
13.12.23
10:49
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку()
3 SleepyHead
 
гуру
13.12.23
10:51
Хм, ошибся, вам не то надо.. так проще свою написать.
4 evorle145
 
13.12.23
10:57
(1) понял, это хорошо, что это планируется.. (2) да, это не то...

Да, свою можно написать, тут не долго, но думал, что есть готовое...
5 Прохожий
 
13.12.23
11:04
Запросом удобно...
6 evorle145
 
13.12.23
11:27
(5) Намекните как? там есть подобно {{%}} но что мне это дает?
7 Garykom
 
гуру
13.12.23
11:49
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Строка, " ")
8 PLUT
 
13.12.23
12:17
(0) СтрРазделить...

СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)

разделитель "{{"

затем в цЫкле по элементам массива
Если Найти(элем, "}}")> 0 Тады

СтрЗаменить(элем, "}}", "")

бинго бонго!
9 Garykom
 
гуру
13.12.23
12:20
(8) Обломись с СтрРазделить
"Строка символов, каждый из которых является индивидуальным разделителем."

СтрРазделить (StrSplit)
Синтаксис:
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Разделяемая строка.
<Разделитель> (обязательный)
Тип: Строка.
Строка символов, каждый из которых является индивидуальным разделителем.
<ВключатьПустые> (необязательный)
Тип: Булево.
Указывает необходимость включать в результат пустые строки, которые могут образоваться в результате разделения исходной строки.
Значение по умолчанию: Истина.
Возвращаемое значение:
Тип: Массив.
Массив со строками, которые получились в результате разделения исходной строки.
Описание:
Разделяет строку на части по указанным символам-разделителям.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
Глобальный контекст, метод СтрСоединить
Использование в версии:
Доступен, начиная с версии 8.3.6.
10 PLUT
 
13.12.23
12:22
(9) думаешь не разделит по "{"

по сути ничего не изменится :)

Найти(элем, "}")>0
11 PLUT
 
13.12.23
12:22
лень в консоли кода проверять..

тыщу раз так делал
12 Garykom
 
гуру
13.12.23
12:23
Проще всего через цикл с позицией и СтрНайти
каждый раз смещая НачальнаяПозиция

Глобальный контекст (Global context)
СтрНайти (StrFind)
Синтаксис:
СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Исходная строка.
<ПодстрокаПоиска> (обязательный)
Тип: Строка.
Искомая подстрока.
<НаправлениеПоиска> (необязательный)
Тип: НаправлениеПоиска.
Указывает направление поиска подстроки в строке.
Значение по умолчанию: СНачала.
<НачальнаяПозиция> (необязательный)
Тип: Число.
Указывает позицию в строке, с которой начинается поиск.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СНачала, то значение по умолчанию равно 1.
Если параметр не задан и в параметре НаправлениеПоиска указано значение СКонца, то значение по умолчанию равно длине строки.
Допускаются значения от 1 до количества символов в строке, в которой выполняется поиск. Если указано значение, не входящее в диапазон, генерируется ошибка "Неверное значение параметра".
<НомерВхождения> (необязательный)
Тип: Число.
Указывает номер вхождения искомой подстроки в исходной строке.
Значение по умолчанию: 1.
Возвращаемое значение:
Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
Описание:
Находит первое вхождение искомой строки как подстроки в исходной строке.
Сравнение выполняется с учетом регистра.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Примечание:
Если параметр <ПодстрокаПоиска> пустая строка, то возвращает 1.
Если оба параметра пустые строки, то возвращает 1.
Пример:
Если СтрНайти(Сотрудник.Имя, "Сергей") > 0 Тогда
    Сообщить(Сотрудник.Имя + " таб. №" + Сотрудник.Код);
КонецЕсли;
См. также:
Глобальный контекст, метод СтрНачинаетсяС
Глобальный контекст, метод СтрЗаканчиваетсяНа
Использование в версии:
Доступен, начиная с версии 8.3.6 (в режиме совместимости с версией 8.3.6 и последующими).
13 PLUT
 
13.12.23
12:26
можно перед разделением заменить двойные {{ на какую-то лабуду

типа "{{" меняем на "#@"
"}}" меняем на "@#"

затем разделить по "#"

ну и Найти "@" и заменить шляпу "@" на ""
14 Garykom
 
гуру
13.12.23
12:28
(11) это как выгрузку в csv написать или его парсер
и забыть что внутри строк могут быть """" и "," и ";"

так и тут кто гарантирует что в тексте не могут быть "{" и "}" одиночные?

или вот такой вариант
"бла бла {{это все один {} один! {{ параметр }} все еще тот же параметр }} сча кончился"
15 Garykom
 
гуру
13.12.23
12:27
(14)+ так что правильное решение это или регулярки или ручной конечный автомат
16 PLUT
 
13.12.23
12:28
(14) внимательно (0) почитай

какой парсер csv? какие одиночные {
17 Garykom
 
гуру
13.12.23
12:29
(16) это аналогия
что задача (и решение) полностью аналогичны например формату  csv
18 PLUT
 
13.12.23
12:29
(14) про одиночные { глянь костыль из (13)
19 oleg_km
 
13.12.23
12:30
(15) Это еще, новомодное ИИ. Отправляешь ей строку, говоришь найди все параметры, сейчасже!!!
20 АгентБезопасной Нацио
 
13.12.23
12:30
РазложитьВМассивПодстрок с "{{"
Затем каждую подстроку разложить по "}}" - первая подстрока после второго разложения и будет токеном.
21 Garykom
 
гуру
13.12.23
12:32
(20) внутри "параметра" могут быть {{}} теоретически
надо для каждой открывающей {{ искать со счетчиком вложений закрывающую }} а все что внутри "параметр"
22 PLUT
 
13.12.23
12:32
(17) а вы всегда универсальные решения на все случаи жЫзни пишете?

а то я знаю примеры, когда один товарищ по ценообразованию в рознице всё предусмотрел. написал универсальный механизьм. но жизнь (точнее маркетолухи) придумали маркетинговый ход, который в этот универсальный на все случаи жЫзни механизьм не уложился и создатель (тварец сего механизьма) пару дней борол и вносил правки. в итоге по рабоче-крестьянски обернул в изсключение этот кипучий случай
23 Garykom
 
гуру
13.12.23
12:33
(22) стараюсь если могу и ресурсы позволяют
или сразу говорю об ограничениях решения
24 PLUT
 
13.12.23
12:35
(23) ну так вотже. простая задачка из (0) на пару минут превращается в залипательные 2 дня и исключения (22)
25 evorle145
 
13.12.23
12:47
(21) конкретно в моем случае такого быть не может=)
26 АгентБезопасной Нацио
 
13.12.23
12:47
(21) теоретически - да. Как теоретически может быть несбалансированность открывающих и закрывающих. И начало с закрывающих.
практически для разбора строки достаточно 10 строк:
МассивТокенов = Новый Массив;
МассивПодстрок=СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаДляПарсинга, "{{");
    Для Каждого эл Из МассивПодстрок Цикл
МассивПодстрок2=СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(эл, "}}");
    Если МассивПодстрок2[0]<>эл Тогда
        МассивТокенов.Добавить(МассивПодстрок2[0]);
    КонецЕсли;
КонецЦикла;