|
Существует ли в БСП процедура распарсить строку? | ☑ | ||
---|---|---|---|---|
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]); КонецЕсли; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |