Имя: Пароль:
1C
1С v8
Быстрое удаление излишних пробелов, в т.ч. табуляций и т.п.. Какие есть варианты?
, ,
0 bolobol
 
19.04.19
10:18
Добрый утро!

Необходимо из текста кода убрать излишние пробелы, в т.ч. табуляции и т.п.
Быстрое удаление интересует. Какие известны варианты?

Спасибо!
80 bolobol
 
19.04.19
13:23
Что такое \хА0 ?
81 bolobol
 
19.04.19
13:27
символ 160, похоже.
82 Timon1405
 
19.04.19
13:27
(79)(80) "\x" + ваше 0160 в 16ной системе. аналогично можно перечислить другие спецсимволы
опишите четкий критерий какие пробелы считаются излишними
83 bolobol
 
19.04.19
13:36
(82) Неразрывный пробел - вполне чётко под критерий "пробельные символы" попадает, но его в \s нет, что странно
84 bolobol
 
19.04.19
13:39
Получилось следующее:

(([^а-яА-ЯёЁa-zA-Z\s\xA0])([\s\xA0]+)([а-яА-ЯёЁa-zA-Z]))|(([^а-яА-ЯёЁa-zA-Z\s\xA0])([\s\xA0]+)([^а-яА-ЯёЁa-zA-Z\s\xA0]))|(([а-яА-ЯёЁa-zA-Z])([\s\xA0]+)([^а-яА-ЯёЁa-zA-Z\s\xA0]))|(([\s\xA0])([\s\xA0]+))

- находит (Буква Небуква) (Небуква Буква) (Небуква Небуква), но не находит (Буква Небуква Буква), т.к. мне нужно, чтобы находил только пробельные части, чтобы их заменить на ничто, а в результат включаются и соседние символы.

Не разобрался, как исключать из результатов части вокруг пробельных символов
85 bolobol
 
19.04.19
13:43
Также - находит 2-ой и последующие пробельные символы, но в начале и конце строки останутся по первому пробельному символу
86 bolobol
 
19.04.19
13:51
Есть же схема описания поиска "найти пробел, ранее которого..., и после которого..." - но не осилил с пониманием закорючк
87 bolobol
 
19.04.19
13:51
ов
88 bolobol
 
19.04.19
13:52
В итоге поиска - только искомые пробелы. И в схеме (Буква Небуква Буква) - будут две замены на (БукваНебукваБуква), а не как в моём регекспе (БукваНебуква Буква), и требует второй проход.
89 dka80
 
19.04.19
14:06
Ctrl+A, Shift+TAB, Shift+TAB, Shift+TAB, Shift+TAB
Ctrl+H, найти " ", заменить на ""
90 Mr_Rm
 
19.04.19
14:38
Если нужно сохранять пробелы в строках, сокращать до одного в комментариях и удалять все остальные, то одним VBScript.RegExp вряд ли можно обойтись. А ещё надо учесть многострочные строки.
91 bolobol
 
19.04.19
14:49
(90) Многострочных строк не надо учитывать. Осталось, как и в начале - разобраться, чем РегЕксп тут может помочь. Находит - да, а вот замену как сделать?
92 Сияющий в темноте
 
19.04.19
14:52
Проще парсер написать,который будет разбирать переменные и выражения.
93 bolobol
 
19.04.19
14:57
(92) Проще - воспользоваться результатами РегЕхп и 1С-кодом его обработать. Но хочется скорости, чтобы результат уже был обработан. Задача вот - правильный РегЕхп написать, что я пока не осилил. В мануалах написано, что возможно, но примеры не работают, а в мануалах - не поясняется.
94 Сияющий в темноте
 
19.04.19
15:00
парсер может оказаться быстрен регекспа,еслм его правильно писать.
опять же,в парсере можно и заодно локальные переменные с однобуквить.
95 bolobol
 
19.04.19
15:01
Не, ну задачу-то не надо усложнять! Только излишние пробелы требуется удалить.
96 Mr_Rm
 
19.04.19
15:09
Вот пример (все пробелы двойные):
  МояПеременая  =  "Текст  сообщения  ""c  кавычками  внутри""  //  не  комментарий  //  """  //  Комментарий  к  этой  строке  "со  строкой  //  и  "не  комментарием"  !
Что должно получиться?
97 quest
 
19.04.19
15:23
Генератор лексических анализаторов в помощь. lex/flex/JFLEX - там все просто
98 bolobol
 
19.04.19
15:46
Всё оказалось проще простого:

((?<=[^а-яА-ЯёЁa-zA-Z\s\xA0])[\s\xA0]+)|([\s\xA0]+(?=[^а-яА-ЯёЁa-zA-Z\s\xA0]))|((?<=[\s\xA0])[\s\xA0]+)

Первый и последний пробелы остаются лишь
99 bolobol
 
19.04.19
16:07
И с конечными и начальными пробелами:
((?<=[^а-яА-ЯёЁa-zA-Z\s\xA0])[\s\xA0]+)|([\s\xA0]+(?=[^а-яА-ЯёЁa-zA-Z\s\xA0]))|((?<=^|[\s\xA0])[\s\xA0]+)|([\s\xA0]+$)
100 bolobol
 
19.04.19
16:09
(96)

МояПеременая="Текст сообщения""c кавычками внутри""//не комментарий//"""//Комментарий к этой строке"со строкой//и"не комментарием"!
101 Garykom
 
гуру
19.04.19
16:11
(100) Ты понимаешь что для этой простейшей задачи регэкспы (движка которых в 1С нет из коробки) не нужны.

И хватит простейшего кода в несколько строчек?
102 Garykom
 
гуру
19.04.19
16:13
Например твой регэксп как обработает?

Моя_Переменая  =  "Текст_сообщения""c_кавычками_внутри"" -// = не__комментарий \ //  """  //  Комментарий  к  этой  строке  "со  строкой  //  и  "не  комментарием"  !
103 Garykom
 
гуру
19.04.19
16:15
(102)+ И еще могу разных символов навставлять, которые не " " и не Символ(9)
104 Вафель
 
19.04.19
16:33
(99) на регэкспах далеко не уедешь.
ибо это путь райт-онли
105 Вафель
 
19.04.19
16:35
вот же quest писал такое
JFlex + CUP – генерация кода на 1С.  Востребовано?
как раз по теме (0)
106 bolobol
 
19.04.19
16:40
(103) И чо? В чём смысл ваших сообщений?
107 bolobol
 
19.04.19
16:41
(102) Ссылки на тестирование работы приводились. Я пользуюсь этим: https://regex101.com
108 fisher
 
19.04.19
16:47
Вспомнилось: "Если у вас есть проблема и вы собираетесь ее решать с помощью регулярных выражений, то теперь у вас две проблемы"
109 Mr_Rm
 
19.04.19
16:59
(100) Т.е. пробелы внутри строк тоже сокращаются. Тогда неинтересно.
110 bolobol
 
19.04.19
17:00
Однако, почему-то 1С на данную конструкцию ругается, синтакс еррор... мдя..
111 Mr_Rm
 
19.04.19
17:03
(110) Точка с запятой - на следующей строке. С ней все нормально.
112 bolobol
 
19.04.19
17:08
Что за шайтанство - синтакс еррор (0x800a1399) на "((?<=[^а-яА-ЯёЁa-zA-Z\s\xA0])[\s\xA0]+)|([\s\xA0]+(?=[^а-яА-ЯёЁa-zA-Z\s\xA0]))|((?<=^|[\s\xA0])[\s\xA0]+)|([\s\xA0]+$)" и всё норм лишь на "[\s\xA0]+"?
113 fisher
 
19.04.19
17:32
(112) Добро пожаловать в прекрасный мир различных диалектов regexp :)
Начать с того, что в VBScript.RegExp кажись "|" не поддерживается.
114 fisher
 
19.04.19
17:36
Хотя нет, в группах поддерживается...
115 bolobol
 
19.04.19
17:41
?<= не поддерживается, но пояснений нет пока....
116 fisher
 
19.04.19
17:55
Задача какая? Заменить множественные табуляции и пробелы на одиночные пробелы и табуляции? Может, подойдет все пробельные последовательности заменить на одиночные пробелы? Выражение было бы простейшим. Но я бы все равно регекспами в 1С это не решал. Во всяком случае до тех пор, пока их в платформу не засунут.
117 bolobol
 
19.04.19
18:05
См. (0)
Упёрлись в то, что не найти пробельную последовательность, идущую после символа к букве, конструкция ?<= не работает, и замены её я не вижу.
118 bolobol
 
19.04.19
18:06
*просто "после символа", без разницы до куда.
119 Garykom
 
гуру
19.04.19
18:32
(117) Ты понимаешь то замена двух пробелов на один дает всегда один пробел, сколько ее раз не применяй?

А можно таб+пробел > пробел, пробле+таб > пробел и т.д. заменять несколько раз.
И будет тебе что требуется простейшим образом без извратов.

Хорош уже прикалываться у тебя задачка простейшая (раз внутри констант тоже меняем), регэкспы нафик не нужны как и синтаксические анализаторы с парсерами.
120 Сияющий в темноте
 
19.04.19
18:42
длстп=СтрДлина(СтрокаДляОбработки);
Начало=НЕОПРЕДЕЛЕНО;
Состояние=1;
Для Поз=1 ПО длстр Цикл
код=КодСимвола(СтрокаДляОбработки,Поз);
Если ЭтоСимволПробела(код)=ИСТИНА Тогда
  Если Начало<>НЕОПРЕДЕЛЕНО Тогда
   рез=рез+Сред(СтрокаДляОбработки,Начало,Поз-Начало);
   Начало=НЕОПРЕДЕЛЕНО;
  КонецЕсли;
  Если Состояние=2 Тогда
   Состояние=3;
  КонецЕсли;
ИначеЕсли Начало=НЕОПРЕДЕЛЕНО Тогда
  Если Состояние=3 Тогда
   рез=рез+" ";
  КонецЕсли;
  Состояние=2;
  Начало=Поз;
КонецЕсли;
КонецЦикла;
Если Начало<>НЕОПРЕДЕЛЕНО Тогда
рез=рез+Сред(СтрокаДляОбработки,Начало);
КонецЕсли;
// рез-наша строка.
121 bolobol
 
22.04.19
09:30
(119) Не понял, о чём вы вообще. Какие два пробела? Если задача простейшая, то где ответ за 116 постов, может, у вас есть?
122 bolobol
 
22.04.19
09:31
(120) Так и не рассмотрел, в чём секрет. Читаю-читаю, получается у меня, что "это строка" вашим кодом превратится в "этострока".
123 bolobol
 
22.04.19
09:34
+к 122: (120) Независимо от того, что скрывается под ЭтоСимволПробела(), т.к. туда сама строка не передаётся, предыдущий, последующий символ - тоже. Да и данный код на 10000 строках - любой сервер обескуражит.
124 Garykom
 
гуру
22.04.19
09:37
(121) 1. Если в комментариях и внутри значений строковых переменных можно и нужно удалять пробелы - задача простейшая.

2. Если эти лишние пробелы внутри значений строковых переменных (Перем1 = "Вася  ты <tab> зачем пробелы тут убрал    ?";) надо сохранить - задача нереально сложная.
125 bolobol
 
22.04.19
10:08
(124) А задачу читали? Она в (0) описана, да и в заголовке тоже.
И даже решение, при помощи волшебного пинка в сторону регексп - разработано, но не работает на ВБСкрипт.Регексп. Нужен аналог команды "?<=<данные>", работающий в ВБСкрипт.Регексп, команды "поиск последовательности только в том случае, если перед последовательностью <данные>"
126 Garykom
 
гуру
22.04.19
10:13
(125) 1. Ну скажи где в (0) описано (момент со строковыми значениями переменных), неоднократно этот вопрос задавали.

2. Все что вы смогли (точнее не смогли) сделать через регулярки, делается простейше через СтрЗаменить.
И про это вам сразу и сказали. Но кто то или не слышит или притворяется и троллит.
127 bolobol
 
22.04.19
10:19
(126) Троллите, пока что, вы меня. В (0) описано что делать со строкой. Пример был дан в течении постов, решение примера, который мне предложили, с вопросом "Что должно получиться?". Что не понятно в части "излишние пробелы"? Какая разница, в тексте они, в строке, в числе?
128 Garykom
 
гуру
22.04.19
10:32
(127) >Что не понятно в части "излишние пробелы"? Какая разница, в тексте они, в строке, в числе?

У нас походу недопонимание. Я считал вас программистом. Ошибался, сорри.
129 bolobol
 
22.04.19
10:42
(128) Взаимно, не отчаивайтесь))
130 Garykom
 
гуру
22.04.19
10:49
(129) Просто кое кто недоговаривает и не правильно понимает задачу.

Судя по (61) где "25000 модулей не проверишь глазами." вам нужен именно (33) а простыми регэкспами задачку не решить.

Потому что внутри "25000 модулей" точно будут "строковые значения переменных" с "лишними символами внутри".
131 bolobol
 
22.04.19
12:48
(130) Предложение в 33 излишне для данной задачи. "строковые значения переменных" с из"лишними символами внутри" - почувствуйте разницу - вполне укладываются в задачу. Мне не понятно, что вам не понятно в слове "излишние".
132 bolobol
 
22.04.19
12:52
Излишний:
1. превышающий нужное количество чего-либо, потребность в чём-либо; избыточный, чрезмерный.
2. такой, без которого можно обойтись; ненужный.
3. перен. такой, присутствие которого нежелательно

- не вижу противоречий даже при наличии столь интересных вам "строковых значений переменных"
133 Garykom
 
гуру
22.04.19
12:53
(131) Мне непонятно что вам непонятно если простое и понятное решение приводилось несколько раз.

А с учетом "25000 модулей не проверишь глазами." - это же ваши слова да?

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

Но регулярными выражениями требуемый анализатор написать конечно можно... Но его эффективность будет никакая, потому что регулярки это уже конечный автомат по сути.
134 Garykom
 
гуру
22.04.19
12:54
(132) Вы мне напоминаете личностей которые да на словах то много говорят и вроде бы даже умно.
Но как поймешь так чушь полная и на деле ничего не могут. Кроме копипастой заниматься.
135 Вафель
 
22.04.19
13:09
ну что уже прикрутили парсер или все еще на регэкспах пишите?
136 bolobol
 
22.04.19
14:38
(134) Пока что - на деле именно вы себя показываете так, вместо чего-то по теме - пустой трёп ниочём.
Забавно читать, что вы указываете мне, постановщику задачи, что я не правильно понимаю её постановку - это финиш, мистянин! Далее уж лучше и не продолжать троллить.

(135) Я уже неоднократно писал, что на 1С парсер не справится. А регексп - не даёт необходимой функциональности, обратной информации не поступало.
137 bolobol
 
22.04.19
14:40
Шанс на ВК остаётся. Правда, если бы хоть конструктор какой, типа "код на Си вставляешь и компилишь"...
138 bolobol
 
22.04.19
14:53
О, нашёл и про ВК. Но, не сегодня))
139 Garykom
 
гуру
22.04.19
15:04
(136) (137) (138) Гыгы. Все с вами понятно, свой ник оправдали на 200%
140 MouHacTaBHuk
 
22.04.19
15:06
(0) слишкоммногасообщений уже. Предложу решение, если оно нужно разово:
- копируем код в sublime text3
- ставим плагин для понимания синтаксиса 1С, и выбираем View - Syntax - Language 1C (BSL) - 1C (BSL)
- заменяем "<space><space>" на "<space>" до тех пор пока не станет "вхождений не найдено"
- то же самое делаем с "<tab><tab>"
- то же самое делаем с ненужными непечатными символами (не думаю что их великое разнообразие оказалось в коде)
- затем нажимаем Edit - Line - Reindent и код выстроится с необходимой табуляцией.
141 Кирпич
 
22.04.19
15:23
Любой нормальный человек молча решит эту задачу за час и никого не спросит. Но мы наколотим ветку в тыщу постов с регехпами и парсерами :)
Господа, вы звери.
142 Garykom
 
гуру
22.04.19
15:27
(141) Час это уже с выполнением кода на 25000 файлах, писать тут минут 10 максимум.
143 Garykom
 
гуру
22.04.19
15:28
(142)+ Если конечно снова не всплывет вопрос что иногда лишние пробелы надо оставлять.
144 Кирпич
 
22.04.19
15:32
(143) ага. или высплывет вопрос "а нафиг оно вообще надо? и так сойдет"
145 Cyberhawk
 
22.04.19
15:34
А про какой парсер тут речь в последних 10 постах? Всю ветку не читал, сорри
146 Garykom
 
гуру
22.04.19
15:38
(144) Ну меня пугает мысль что вот эти лишние символы это некая DRM система хитрая или цифровой подписи и кто пытается ее снять.
Иначе нафига их убирать если и так все работает?
147 Garykom
 
гуру
22.04.19
15:39
(145) См (102) я так и не понял надо ли убирать
Перем ="1     2";
лишние пробелы тут внутри значения строковой переменной.
148 Garykom
 
гуру
22.04.19
15:39
(147) сорри *"лишние пробелы"
149 Кирпич
 
22.04.19
15:55
(147) ну уж конечно не надо убирать. это же текст программы. в строковых константах оставлять однозначно
150 bolobol
 
22.04.19
16:01
(141) Так - предложите же, хотя бы, принципиальное решение, или вы не "нормальный человек"?
(145) Ну, парсер - не парсер, но регексп уже попытался заюзать - недостаточен функционал у ВБСкрипт.Регексп оказался.
(149) Кто такую глупость вам сказал? В этой строке - все видимые глазом пробелы - излишние.
151 Cyberhawk
 
22.04.19
16:05
(147) (150) Так под "парсером" подразумевается надстройка, выполняющая-обрабатывающая код как текст что ли?
152 bolobol
 
22.04.19
16:10
(151) "Я не в курсе, ребята!" ))
Но - обработать нужно текст, являющийся кодом 1С.
153 Garykom
 
гуру
22.04.19
16:16
(152) Ну так заплати и тебе все сделают как надо.
Или любимое домашнее животное возмущается?
154 Cyberhawk
 
22.04.19
16:20
(152) "обработать нужно текст, являющийся кодом 1С" // Выгрузить конфу в файлы, обработать кодом 1С уже предлагали? :)
155 Garykom
 
гуру
22.04.19
16:30
(154) Чуть реже чем замену "  " на " " и "<tab><tab>" на " "
156 Кирпич
 
22.04.19
17:08
(150) "В этой строке - все видимые глазом пробелы - излишние."
так программа неправильно работать будет, если удалить эти пробелы. или вам пробелы удалять чисто из спортивного интереса?
157 bolobol
 
22.04.19
17:51
(156) Не пойму, потеря какого из пробелов вызывает у вас опасение за работу программы?
158 akronim
 
22.04.19
18:02
Хороший ТС, и вопросы интересные.
(150) "В этой строке - все видимые глазом пробелы - излишние"
Ок, какие лишние пробелы в строке
"ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя"
?
159 Garykom
 
гуру
22.04.19
18:17
(158) "ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя Как Заказ ГДЕ Заказ.Номер Подобно ""%  %"""
160 lodger
 
22.04.19
18:33
(158) имхо, в этой строке нет лишних символов.
(159) тут тоже, ведь кавычки не "излишние пробелы, в т.ч. табуляции и т.п."
161 Garykom
 
гуру
22.04.19
18:51
(160)
Внутри ""%  %"" у мен два пробела и отличается визуально слегка от
Внутри ""% %"" один пробел
162 quest
 
22.04.19
19:13
(136) тут парсер даже не нужен. это тупо лексер. голимый лексер который на коленке пишется за вечер. С чтением документациии и перерывами на попить пивка - два вечера. Но ты уперся в регэкспы... Они не работают с твоей задачей, не для этого предназначены регэкспы, но ты упорно пытаешься их прикрутить. И еще обижаешься когда тебе указывают на твои ошибки.
163 Garykom
 
гуру
22.04.19
19:24
(162) Тут задачку надо от обратного решать, искать через регулярки то что не надо чистить.
Регулярка должна вернуть набор подстрок которые не правятся.
Далее ищем эти подстроки по очереди в тексте, выделяем кодом то что между ними и правим заменой.

Но ТС не справится.
164 Garykom
 
гуру
22.04.19
19:25
(163)+ Но да это тот же лексер, только неполный и на регэкспах
165 quest
 
22.04.19
19:39
(163) Это задача  сводится к другой - pretty-print. Т.е. имея код преобразовать его в поток лексем, затем этот поток вывести на печать. ТС в конце-концов придет к этой задаче, потому что следующим требованием будет - быстро найти и исправить неверное написание ключевых слов (там где ключевые слова отличаются от их канонического написания) , затем найти и исправить отличия в именах типов, затем проанализировать наличие комментариев.. Просто ТС пока этого не понимает и думает что все закончится на пробелах и табах.
Ну а твое предложение - от обратного - вообще за гранью добра и зла.
166 Кирпич
 
23.04.19
08:16
(157) если пользователь получит сообщение "Файлненайден.Проверьтеправильностьименифайлаиповторитепопытку.", то это нормально.
167 Bolobol
 
23.04.19
12:12
Балаболы, задачу-то читали, или так - потрещать?
Следующие требования, файл не найден.... Вы к чему это всё? Прочтите задачу.
Но, за ап темы - спасибо, вдруг знаток вбрегексп заскочит
168 Кирпич
 
23.04.19
12:19
(167) А где описание задачи?
169 Bolobol
 
23.04.19
12:47
Всё ясно с вами
170 Кирпич
 
23.04.19
13:12
(169) И тебе не хворать, гений :)
171 quest
 
23.04.19
13:13
(169) https://www.anekdot.ru/id/676992/ лети, голубь
172 Bolobol
 
23.04.19
13:18
Всё уже давно с вами ясно, не стоит это ещё больше показывать. Засираете тему только своим бредом
173 Вафель
 
23.04.19
13:18
(171)нет чтоб помочь человеку, раз уж подобную задачу делал
174 Garykom
 
гуру
23.04.19
13:19
(173) Дык я делал подобную задачу двумя способами через СтрЗаменить и лексер/парсер.
175 quest
 
23.04.19
13:23
(173) для тебя решение задачи - бред. Никого кроме себя не слышишь. Схватил регэкспы - и носишься с ними. И как тебе помочь? Посоветовать книжки почитать? так это очень сложный путь и тебе не осилить. Проще написать (172)
176 lodger
 
23.04.19
14:26
(172) потому что в первых 10 сообщениях были озвучены рабочие решения.
а в первой сотне даже куски кода готовые.
177 13_Mult
 
23.04.19
14:51
Когда-то давно решал похожую задачку v8: Быстрый способ обработки Таблиц значений, Массивов
178 bolobol
 
24.04.19
09:45
(173) Как раз - наоборот! Для меня решение задачи - очень важно, а для вас - выглядит бредом. Если по делу нечего написать, лучшей помощью будет - не засирать тему бессмыслицей. Спасибо за понимание!

(176) Покажите, будьте так любезны, где я пропустил рабочее решение? Ткните носом, если вам так приятнее будет. Осторожнее - лужи!

(177) У вас все пробелы удалить задача - это просто, у нас - только излишние, "РегистрНакопления.Останки КАК Останки" - должно остаться с пробелами, т.к. "РегистрНакопления.ОстанкиКАКОстанки" - это уже названием таблицы становится. Как в данном примере - не принципиально для решения, но вдруг могут случиться такие примеры, где это скажется негативно. Пока - примера подобного не видел, но со счетов сбрасывать опасаюсь. Условие "читабельность" нарушается, и это единственная причина, что сразу не было сделано именно так.
179 Кирпич
 
24.04.19
10:15
пятый день пошел