|
помогите с регуляркой | ☑ | ||
---|---|---|---|---|
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
|
match (\d+\.\d+)$
https://regex101.com/r/0Ui1Dv/1 |
|||
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |