Воскресенье, 13.10.2024, 03:54
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Добавить в "Конструктор регулярного выражения" 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, а как жить без ИР уже и не представляю  wacko


Сообщение отредактировал 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 и между ними можно переключаться и много еще чего вкусного...
Прикрепления: ReExpTest.0.1.zip (251.7 Kb)


Сообщение отредактировал 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, но без ИР она мне даром не сдалась  biggrin
Но решение нужно ли это развивать и в каком направлении - не за мной.


Сообщение отредактировал 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.
Не сильно сложно вся эта штука, а код, ну код разумеется будет доступен.
Прикрепления: Test2.zip (252.0 Kb)


Сообщение отредактировал 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. На очень больших данных может вылетать, я фактически использую сс, а не с++, пока динамическое расширение буфера не прикрутил, но для тестов его должно хватить.
Прикрепления: Test3.7z (535.4 Kb) · 5919220.jpg (199.7 Kb)


Сообщение отредактировал 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
 
  • Страница 1 из 1
  • 1
Поиск: