Имя: Пароль:
1C
 
помогите с регуляркой
0 kittystark
 
20.09.22
14:10
есть многострочный текст - типа превью кассового чека
(цифры бредовые, но это ладно)

Болт с шест.гол. (DIN
933)
            0.111 х 5555.55=333.33
НДС 20%                          
ТОВАР                            
ПЕРЕДАЧА В КРЕДИТ                

КОД СТРАНЫ:555                    
ДЕКЛАРАЦИЯ:111111/22222/33333
ЕД.ИЗМЕРЕНИЯ:тыс. шт              

Болт с шест.гол 2 (DIN
933)
           2.222 х 3333.33=7777.77
НДС 20%                          
ТОВАР                            
ПЕРЕДАЧА В КРЕДИТ                

КОД СТРАНЫ:555                    
ДЕКЛАРАЦИЯ:111111/22222/33333
ЕД.ИЗМЕРЕНИЯ:тыс. шт
1 kittystark
 
20.09.22
14:12
хочу получить на выходе, после применения regExp.Replace
333.33
7777.77
т.е. оставить только то, что после знаков равенства, остальное грохнуть
2 kittystark
 
20.09.22
14:14
в два шага почти сделал

.*=(\d+\.\d+)$  -> $1

(?!\d+\.\d{2}).....*   ->  ничего
3 kittystark
 
20.09.22
14:15
но как-то не то, в других строках иногда лишнее остается
4 Fish
 
20.09.22
14:16
Имхо, проще идти по строкам и выбирать все между символом "равно" и "перевод строки".
5 RoRu
 
20.09.22
14:18
(4) можно строчку перед "ндс" только смотреть
6 kittystark
 
20.09.22
14:20
(4) тут уже дело принципа, хочу добиться результата даже не ради результата,
а чтоб понять как надо - чисто для академических знаний
на будущее, так сказать
7 Fish
 
20.09.22
14:21
(6) А, ну если принцип важнее результата, то дело другое.
8 kittystark
 
20.09.22
14:24
(7) да,
пройтись по строкам и через стрНайти / Лев / Сред - плевое дело
9 lodger
 
20.09.22
14:33
10 lodger
 
20.09.22
14:35
ну хошь, с равно бери метч https://regex101.com/r/0Ui1Dv/3
а потом вытаскивай из матча группу
11 kittystark
 
20.09.22
14:39
(10) с матчем понятно, его еще обходить надо будет циклом (если VBScript.RegExp под винду использовать)
я хочу воткнуться в шаблон (?!) и через реплейс сделать

понимаю, что это можно как-то так сделать, но не понимаю пока как, а хочу

вот и прошу помощи
12 lodger
 
20.09.22
14:49
(11) реплейс кого на что?
13 Ryzeman
 
20.09.22
14:50
(12) видимо, всего остального что не совпадёт на пустую строку.
14 lodger
 
20.09.22
14:57
(13) (11) в таком сценарии не надо гонять регэкспу. оно для этого не предназначено. можно, но криво и косо - по тактам процессора выйдет дешевле 1ской.
15 Ryzeman
 
20.09.22
15:03
(14) у человека Академический интерес)
16 kittystark
 
20.09.22
15:04
(14) это не в продакшен
встала разовая задача и ты такой, ща я по-быстрому,
чтобы не копипастить 500 раз нужные строчки, в своей любимой самописной консольке...

а получилось как в том бородатом анекдоте:
была 1 проблема
я знаю эту задачу можно решить с помощью регулярок!
теперь 2 проблемы
17 Kassern
 
20.09.22
15:05
(15) Скоро выйдет регулярка 1с из коробки, вот там и надо проявлять этот интерес)
18 Ryzeman
 
20.09.22
15:07
(17) Может, он заранее и готовится) Но да, как то именно replace использовать.. Ну такое)
19 kittystark
 
20.09.22
15:08
(17) шли годы...

когда они этот релиз в боевое плавание выпустят ? :)

а знания уже можно и сейчас прокачать
20 Kassern
 
20.09.22
15:11
(19) Планируется в версии 8.3.23, а когда выпустят - хз
21 kittystark
 
20.09.22
15:23
(18) да не, классный инструмент, гораздо круче стрЗаменить
надо только научиться им пользоваться
по началу тяжело, потом втягиваешься
22 Fish
 
20.09.22
15:33
(21) "по началу тяжело, потом втягиваешься" - А потом появляется реальная задача, и ты применяешь СтрЗаменить, потому что это работает на все 100% :)))
23 kittystark
 
20.09.22
15:46
(22) не поверишь, НО!!!
стрЗаменить уже стал использовать гораздо реже, в десятки!!! раз реже, чем regExpReplace
24 kittystark
 
20.09.22
15:47
просто когда с регулярками имеешь дело больше 10-ти лет, то это не сложно
25 Kassern
 
20.09.22
15:47
(23) Кем и зачем? Какой в этом профит?
26 kittystark
 
20.09.22
15:49
(25) что значит "Кем?"
27 Kassern
 
20.09.22
15:50
(26) Я в типовых не заметил, чтобы в десятки раз реже использовали стрЗаменить чем regExpReplace
28 Kassern
 
20.09.22
15:50
Наверное есть для этого причина? А что делать будете, если клиент/сервер на линуксе будет?
29 Kassern
 
20.09.22
15:52
Если мы говорим в плане быстродействия, то создание объекта regExp это тоже не бесплатная операция. Приходится обращаться к функционалу винды и от нее получать ответ, нежели выполнять встроенный метод платформы.
30 kittystark
 
20.09.22
15:52
а профит в том, что вместо пачек кода "если найти() тогда лев()/Прав()/Сред()/стрЗаменить()"
31 kittystark
 
20.09.22
15:52
можно написать регулярку - и задача решена
32 kittystark
 
20.09.22
15:53
(27) лет через 10 будет
33 Kassern
 
20.09.22
15:56
(31) Судя по этому посту, не все так тривиально. А вообще, проще получить xml файл с данными по чеку. Далее его прочитать и получить значение тега. Это будет куда универсальнее и правильнее.
34 Fish
 
20.09.22
15:57
(28) "А что делать будете, если клиент/сервер на линуксе будет?" - А вот это будет печалька. Или разведут клиента на новую доработку :))
35 kittystark
 
20.09.22
16:04
(34) тут с месяц назад была ветка, как раз про 23-й релиз и зазеркалье
и где-то была ссылка на гит-хабе на нативную компоненту для линуха
а про развод клиента - я фиксик, так что мимо
36 Fish
 
20.09.22
16:09
(35) "и где-то была ссылка на гит-хабе на нативную компоненту для линуха" - Ну т.е. сам себе готовишь лишние танцы с бубном. Или придётся объяснять начальству, почему для перехода на линукс надо будет переписывать код 1С и подключать какие-то левые дополнительные компоненты.
37 kittystark
 
20.09.22
16:16
(36) я использую регулярки только на клиенте под винду в своих обработках - ДЛЯ СЕБЯ,
и под линух переходить пока не собираемся
так что проблем не вижу
38 Fish
 
20.09.22
16:21
(37) Ну т.е. о чем я и писал в (22). Когда появляется реальная задача - использовать такое это моветон.
"и под линух переходить пока не собираемся" - Очень недальновидный подход. Сейчас может возникнуть необходимость ВНЕЗАПНО переходить на линукс, и тогда собираться и раскачиваться времени будет мало. Но это личное дело каждого, конечно.
39 kittystark
 
20.09.22
16:31
(38) ты б лучше для поставленной задачи решение предложил
41 lodger
 
20.09.22
16:34
(39) тебе уже сказали вынуть пюпитр из промышленного слайсера, отойти на шаг выше от "Печатной формы" и достать xml-пакет с чеком (33)
43 Fish
 
20.09.22
16:39
(39) Так в (4) решение предложено. Но тебе же не решение нужно было, а танцы с бубном через сторонние сервисы.
44 kittystark
 
20.09.22
16:42
(43) да я познаю дзен - мне нужно понять как в поставленной задаче применить шаблон (?!), всего лишь
45 Fish
 
20.09.22
16:45
(44) Кошерно делать это средствами 1С, не завязываясь на виндовые сервисы. И в (33) тебе подсказали, как делать ПРАВИЛЬНО, а не через одно место.
46 kittystark
 
20.09.22
16:47
(45) как-бы так еще раз объяснить...  доходчиво...

это СПОРТИВНЫЙ интерес
47 Kassern
 
20.09.22
16:49
(46) Пробуйте, как получится - отпишитесь, может кому пригодится. Видимо, остальные участники топика подобным не страдали, поэтому вряд ли подскажут, как этот вопрос решить через реплейс.
48 Timon1405
 
20.09.22
17:35
(46) мне кажется, у вас интерес какой-то нездоровый(зациклились на ?!), а не спортивный, задачу же можно решить разными способами. вам же в (4) предлагают примерно такое
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern="=([\d\.]+)$";
МояСтрока = "  2.222 х 3333.33=7777.77";
МассивВыражений = RegExp.Execute(МояСтрока);
Если МассивВыражений.count() >0 Тогда
    МойКусок= МассивВыражений.Item(0).SubMatches().Item(0);
Иначе
    МойКусок="";
КонецЕсли;
49 kittystark
 
20.09.22
17:49
(48) все это я знаю, с матчами не первый год работаю

вот смотри
.*<\/*?(?![^>]*?\b(?:query)\b)[^>]*?>.*
если это натравить на схему СКД - получим только тексты запросов
остальное отсеится

хочется чего-то подобного
50 kittystark
 
20.09.22
17:51
на данный момент эксперименты привели к
.*(?!.*=)(?!\d+\.\d+).....*

позволяет оставить только строки вида
"  2.222 х 3333.33=7777.77"

но полностью задачу пока не решил
51 kittystark
 
20.09.22
23:11
через (?!...) не получилось, получилось пока так

[\S\s]+?=(\d+\.\d+)|[\S\s]+        ->  $1\n