Добавить в "Конструктор регулярного выражения" RegEx1CAddin
|
|
aae99999 | Дата: Пятница, 02.10.2020, 18:30 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| https://github.com/alexkmbk/RegEx1CAddin/releases/tag/11
1. Эта штука работает. 2. postges и linux наступают на пятки, вернее их уже мне сгрызли! 3. Почти (проверить все сложновато) работает, а execute не могло работать раньше никак, но теперь то может! 4. Разделяет через КоличествоВложенныхГрупп и RegExp.Следующий(). Но! 5. RegexBuddy как то не правильно конвертирует, либо диалект выбираю не тот (вот поэтому и нужна поддержка в конструкторе). 6. Насколько мог посмотреть, все остальные функции заменяются на RegEx1CAddin достаточно просто. Только execute не работало.
Что-то удалось, что то нет... Работы там до черта, уже посмотрел.
Предложения: Может стоит RegEx выделить в отдельный модуль? Тогда можно как то сравнивать оба результата (на переходном периоде). Возможно и запросы сделать именованными и тоже засунуть туда же в модуль.
Я не большой сторонник "разработки через тестирование", но в этом случае это видимо оправдано (и есть с чем сравнивать).Добавлено (05.10.2020, 17:08) --------------------------------------------- Собрал эту штуку, пока для Win64, добавил кое-что для совместности с VBScript.RegExp типа MultiLine и Test(), чтобы как можно меньше менять в коде. Пока это только заглушки, чтобы все запускалось без лишних ошибок.
Код // ирКэш.Модуль Функция ВычислительРегулярныхВыраженийЛкс() Экспорт // Вычислитель = Новый COMОбъект("VBScript.RegExp"); ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native); Вычислитель = Новый("AddIn.Component.RegEx"); Вычислитель.IgnoreCase = Истина; Возврат Вычислитель; КонецФункции
Код библиотеки совсем не сложный, видимо возможно эмулировать все функции VBScript.RegExp. С паттернами - уже хуже, был бы отдельный ПостроительПаттернов было бы значительно легче.
Уже 4 сервера на Ubuntu 18.04, а как жить без ИР уже и не представляю
Сообщение отредактировал aae99999 - Пятница, 02.10.2020, 18:36 |
|
| |
tormozit | Дата: Вторник, 06.10.2020, 23:27 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 6393
Репутация: 165
Статус: Оффлайн
| Про эту ВК есть у меня задача https://www.hostedredmine.com/issues/889592 .
Однажды я уже предпринимал попытку перехода на native ВК ради ускорения и та (v8Rex от Орефкова) была намного более совместима с используемым в подсистеме COM объектом. Но в итоге из-за ее нестабильности все пришлось откатывать. Автор так и не стал разбираться с аварийным завершением процесса 1С.
Эта ВК заметно хуже той в плане перевода на нее ИР - он более медленная и намного менее совместимая. Не вижу смысла на это тратить столько сил.
|
|
| |
aae99999 | Дата: Среда, 07.10.2020, 16:56 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| У RegEx1CAddin есть нерешаемая проблема - тормознутось вызова методов из-за NativeAPI.
Если в тесте http://forum.infostart.ru/forum28....e901627 убрать все вызовы, кроме ре.Шаблон = "(\d+)"; то RegEx1CAddin в 4.5 раза медленнее VBScript.RegExp (причем я в методе на с++ пробовал просто сразу же поставить возврат, без всякой обработки этой строки - ничего почти не изменилось).
ВК от Орефкова, тут конечно быстрее - она нештатным образом влезает внутрь 1С, но из-за этого и все ее проблемы.
В принципе замедление почти в 5 раз на вызове методов терпимо, это не должно сильно сказаться на работе, это микросекунды. И я не заметил чтобы ИР очень много чего делал с RegExp в циклах, чтобы это как то повлияло...
А вот boost::regex, судя по гуглению, ведет себя не очень хорошо! Причем разница может быть в разы при использовании msvc и gcc (gcc в большом плюсе). Если на отдельный вызов метода можно не сильно обращать внимание, то на разбор большого объема текста стоит!
Видимо стоит переползти на эту штуку: https://github.com/kkos/oniguruma Или какой то аналог, движков regexp не мало. Но это будет уже другая компонента. Пока изучаю. Что-то видимо не получится сделать, я так понимаю, NativeAPI не позволяет сделать реализацию цикла "Для Каждого".Добавлено (13.10.2020, 18:10) --------------------------------------------- Уже почти работает. Тут два решения, либо из ВК отдавать (ВСЕ) данные в виде текста для сериализации средствами 1с либо из ВК дергать методы для получения следующего текста методом Next() Пока оберну возврат в json (1C переваривает json очень быстро). Возможно сделать вариант возврата для произвольной сериализации.
Сообщение отредактировал aae99999 - Среда, 07.10.2020, 17:18 |
|
| |
aae99999 | Дата: Среда, 14.10.2020, 15:06 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| Наконец в черновом варианте заработало! Тест во вложении.
Сравнение сделано относительно честно: на выходе обоих тестов заполнен Массив. А не так плохо! Благодаря сериализации удалось обогнать Vbscript.RegExp. Код Длина текста: 100 Oniguruma1C 1 000 проходов = 108 мс 0,108 на один проход Vbscript.RegExp 1 000 проходов = 151 мс 0,151 на один проход Длина текста: 200 Oniguruma1C 1 000 проходов = 124 мс 0,124 на один проход Vbscript.RegExp 1 000 проходов = 191 мс 0,191 на один проход Длина текста: 400 Oniguruma1C 1 000 проходов = 145 мс 0,145 на один проход Vbscript.RegExp 1 000 проходов = 354 мс 0,354 на один проход Длина текста: 800 Oniguruma1C 1 000 проходов = 196 мс 0,196 на один проход Vbscript.RegExp 1 000 проходов = 675 мс 0,675 на один проход Длина текста: 1 600 Oniguruma1C 1 000 проходов = 289 мс 0,289 на один проход Vbscript.RegExp 1 000 проходов = 1 315 мс 1,315 на один проход Длина текста: 3 200 Oniguruma1C 1 000 проходов = 475 мс 0,475 на один проход Vbscript.RegExp 1 000 проходов = 2 617 мс 2,617 на один проход Длина текста: 6 400 Oniguruma1C 1 000 проходов = 868 мс 0,868 на один проход Vbscript.RegExp 1 000 проходов = 5 183 мс 5,183 на один проход Длина текста: 12 800 Oniguruma1C 1 000 проходов = 1 643 мс 1,643 на один проход Vbscript.RegExp 1 000 проходов = 11 655 мс 11,655 на один проход Длина текста: 25 600 Oniguruma1C 1 000 проходов = 3 230 мс 3,23 на один проход Vbscript.RegExp 1 000 проходов = 22 443 мс 22,443 на один проход Длина текста: 51 200 Oniguruma1C 1 000 проходов = 6 669 мс 6,669 на один проход Vbscript.RegExp 1 000 проходов = 46 971 мс 46,971 на один проход
Пока собрано для Win64, но на Linux тоже собирается. https://cloud.mail.ru/public/GW8T/2SsxdZThN
Но чтобы продолжить работу, нужно понять стоит ли это вообще делать?
Кстати, oniuruma поддерживает 6 вариантов regexp и между ними можно переключаться и много еще чего вкусного...
Сообщение отредактировал aae99999 - Среда, 14.10.2020, 15:14 |
|
| |
tormozit | Дата: Среда, 14.10.2020, 15:34 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 6393
Репутация: 165
Статус: Оффлайн
| У подсистемы режим поддержка платформ начиная с 8.2.13. JSON появился в 8.3.6. Поэтому нужно делать такую ВК которая позволит малыми затратами поддержать переключение VBScript/ВК, т.е. она должна иметь свойства, методы и их поведение максимально близкие к VBScript. Из тестового примера я этого не увидел.
|
|
| |
aae99999 | Дата: Среда, 14.10.2020, 16:14 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| Это я понимаю! Но ЗначениеИзСтрокиВнутр никто не отменял и оно всегда было т.е. можно в Массив и без json перегонять данные. Для начала, нужно было понять скорость работы и корректность полученных данных, а с json это сделать было значительно быстрее. Без десериализации никак не обойтись, иначе это не будет AddinNative и не факт что 1С это понравится! Можно даже несколько вариантов возврата сделать, но это все позже.
Сейчас видно что эта штука работает и работает быстрее чем RegEx1CAddin и *условно* быстрее vbscript.regexp, но без ИР она мне даром не сдалась Но решение нужно ли это развивать и в каком направлении - не за мной.
Сообщение отредактировал aae99999 - Среда, 14.10.2020, 16:41 |
|
| |
aae99999 | Дата: Пятница, 16.10.2020, 09:14 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| Переделал получение массива c json`а на ЗначениеИзСтрокиВнутр и тестовую обработку. Замер чуть более сложного шаблона (еще секунду можно выжать, если заменить в Oniguruma шаблон на "(\w+)") Код Шаблон: ([\wА-яёЁ]+) Размер массива совпадений: Oniguruma1C 6 145 Vbscript.RegExp 6 145 Oniguruma1C 100 проходов = 1 015 мс 10,15 на один проход Vbscript.RegExp: 100 проходов = 8 269 мс 82,69 на один проход Длина текста: 52 224
Можно в ТЗ с колонками FirstIndex,Length,Value загнать, а не в массив, будет совместнее с VBscript. Интересно, можно ли определить вызывается функция по русски или по английски и с русской функцией возвращать русифицированные имена колонок... Хм, вроде да, сделать два варианта Execute,ВыполнитьEng и ExecuteRus,Выполнить. Test очень легко сделать, с Replace придется повозится (в библиотеке этого нет). Еще добавить свойство - диалект парсера и вырезать все кодовые страницы, кроме UTF-16LE для уменьшения размера. Вроде ничего не забыл? Можно же что-то еще позаковырестее придумать...
Добавлено (16.10.2020, 16:57) --------------------------------------------- Или выгрузку не в ТЗ делать? Тогда в какой тип? Или микс из типов? Нужно решение этого вопроса, для дальнейшей разработки! Переделывать можно бесконечно, поэтому и были выбраны самые примитивные типы выгрузки, что в первом, что во втором варианте.
P.S. я как то не упомянул, я по факту Djelf, тот кто подтягивает 1sqlite от Орефкова до нынешних реализаций sqlite. Не сильно сложно вся эта штука, а код, ну код разумеется будет доступен.
Сообщение отредактировал aae99999 - Пятница, 16.10.2020, 17:09 |
|
| |
aae99999 | Дата: Среда, 21.10.2020, 18:00 | Сообщение # 8 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| Цитата tormozit ( ) У подсистемы режим поддержка платформ начиная с 8.2.13. JSON появился в 8.3.6. Поэтому нужно делать такую ВК которая позволит малыми затратами поддержать переключение VBScript/ВК, т.е. она должна иметь свойства, методы и их поведение максимально близкие к VBScript. Из тестового примера я этого не увидел. Прошу посмотреть новую сборку и тестовую обработку.
regexp.execute(текст) совместен (насколько я вижу, на 100%) с МассивомСоответветствий и Вложенным Массивом Submatches.
Для совместимого поведения будет достаточно заменить Matches = RegExp.Execute(текст); на Matches = ЗначениеИзСтрокиВнутр(Oniguruma.Execute(текст));
P.S. Насчет regexp.replace я в шоке, эта штука кажется не делает то что я хочу! Можно исправить, ИМХО!, это очень странное поведение.
P.P.S. Под линух чуток с Lenght и FirstIndex не получилось, но результат выборки совпадает (допилю).
P.P.P.S. На очень больших данных может вылетать, я фактически использую сс, а не с++, пока динамическое расширение буфера не прикрутил, но для тестов его должно хватить.
Сообщение отредактировал aae99999 - Среда, 21.10.2020, 18:10 |
|
| |
tormozit | Дата: Понедельник, 26.04.2021, 08:57 | Сообщение # 9 |
Генералиссимус
Группа: Администраторы
Сообщений: 6393
Репутация: 165
Статус: Оффлайн
| В связи с добавлением поддержки Linux в подсистеме - тема ВК стала актуальной. Текущее видение решения всех проблем по переводу на нее подсистемы в следующем.
От ВК нужен метод ПолучитьПолныйРезультат(), который бы возвращал весь результат (все вхождения с подгруппами) в сериализованном виде.
Я в подсистеме для ВК сделаю 3 объекта типа "Обработка", которые будут полностью имитировать COM объекты VBScript - корневой объект RegExp - объект Matches (результат Execute) - объект Match (элемент коллекции Matches) Эта обработка RegExp внутри уже будет звать методы ВК. Сначала она будет получать полный результат через метод ВК.ПолучитьПолныйРезультат() и затем будет его десериализовывать в структуры 1С и уже из них затем выдавать результаты остальных функций (Matches, Match). Так будет и проще сделать полную имитацию интерфейса VBScript и работать думаю будет сопоставимо быстро за счет значительного сокращения вызовов к ВК.
Цитата ЗначениеИзСтрокиВнутр(Oniguruma.Execute(текст)) Это близко к тому что нужно. Но нужны все свойства групп (FirstIndex, Length, Value)
|
|
| |
aae99999 | Дата: Понедельник, 26.04.2021, 10:52 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 10
Статус: Оффлайн
| Цитата tormozit ( ) Это близко к тому что нужно. Но нужны все свойства групп (FirstIndex, Length, Value) На скрине постом выше вроде это заполнено. Я проверял и в VBScript.Regexp и в Oniguruma, дерево совпадает на Текст="<tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>"; Паттерн="([^<]*)(<[^>]*>)([^<]*)";
Или еще что-то нужно? Можно же не упираться в синтаксис VBScript.regexp, если какой-то метод получения данных будет более эффективен.
Еще придется разобраться с, ну скажем так, с "обратным заглядыванием", в японской версии Онигурума его вырезали, видимо из соображений производительности некоторых запросов, чтобы не давать слишком вольно их писать. Вроде в Руби используется форк Онигомо и там это работает. Не исследовал еще этот момент. Некоторые запросы в ИР пришлось слегка из-за этого поправить, вроде заработало, но переписывать придется довольно много.
Прошло больше полугода, придется изрядно вспоминать, что я там уже сделал, что запланировал, а что забыл. Не уверен что сейчас получится быстро.
А вот если бы хотя бы обертку на RegEx1CAddin для начала... И пусть подтормаживает - потерпим. Или совмещенную с VBScript.regexp для работы на Винде с одновременным логгированием того что обрабатывается. Иначе выискивать несоответствия в запросах будет слишком долго.
P.S. мне тоже на NativeAPI такой подход не очень нравится, поэтому и приостановил работу. Но другого варианта видимо нет.
|
|
| |
tormozit | Дата: Вторник, 11.05.2021, 22:48 | Сообщение # 11 |
Генералиссимус
Группа: Администраторы
Сообщений: 6393
Репутация: 165
Статус: Оффлайн
| Реализовано в 5.91 https://www.hostedredmine.com/issues/927435
|
|
| |