Парсер регулярных выражений без Com

Обсуждение различных вопросов, связанных с разработкой и эксплуатацией 1С-Предприятия 8.X
1cmax
Сообщения: 51
Зарегистрирован: 13 июн 2012, 20:52

Парсер регулярных выражений без Com

Сообщение 1cmax »

Все пытаюсь загуглить, есть ли парсер регулярных выражений для 8.2 без использования COM объекта "VBScript.RegExp"
Не нашел...

Скажем набор функций, делающий то же самое,
Чисто теоретически можно взять исходник оперсорсного парсера и сделать на встроенном языке 1с.
Не факт, что быстро будет работать, но хотя бы будет..
Занимался этим кто-нибудь.. интересно...

Сервак на линухе, веб-клиент, а нужно парсить регулярные выражения на сервере без использования COM
Как быть?
Magister
Сообщения: 343
Зарегистрирован: 04 июн 2012, 09:28

Re: Парсер регулярных выражений без Com

Сообщение Magister »

Правильный путь - написать ВК с использованием Native API.
Неправильный, но теоретически работоспособный - вызывать какой-нибудь скрипт на bash/python/что-угодно через КомандаСистемы.
Правда на 14-м релизе под Linux это не работало по непонятным причинам.
В реальності все не так, як насправді
1cmax
Сообщения: 51
Зарегистрирован: 13 июн 2012, 20:52

Re: Парсер регулярных выражений без Com

Сообщение 1cmax »

Magister писал(а):Правильный путь - написать ВК с использованием Native API.
Неправильный, но теоретически работоспособный - вызывать какой-нибудь скрипт на bash/python/что-угодно через КомандаСистемы.
Правда на 14-м релизе под Linux это не работало по непонятным причинам.

скрипт ос мм, интересно..
интересно а вк такую никто не писал ?
sosnae
Сообщения: 588
Зарегистрирован: 20 дек 2011, 10:31
Откуда: Украина, Запорожье

Re: Парсер регулярных выражений без Com

Сообщение sosnae »

Fragster с мисты обещал, когда-то написать скриптик на php с поиском по RegExp. Идея такая - поднимаем web сервер и делаем http запрос к localhost.
Аватара пользователя
orefkov
Администратор
Сообщения: 2052
Зарегистрирован: 24 авг 2011, 15:04

Re: Парсер регулярных выражений без Com

Сообщение orefkov »

Самый прикол, что 1С для работы с юникодом использует ICU, пакет от IBM. И в нем помимо всего прочего, есть и работа с регэкспами.
Т.е. 1С надо всего лишь написать обертку вокруг уже имеющихся функций, чтобы можно было пользоваться из языка 1С.
Дай ка я сейчас в порядке изучения NativeAPI попробую сделать это сам.
Аватара пользователя
lustin
Сообщения: 98
Зарегистрирован: 28 авг 2011, 08:20

Re: Парсер регулярных выражений без Com

Сообщение lustin »

orefkov писал(а):Самый прикол, что 1С для работы с юникодом использует ICU, пакет от IBM. И в нем помимо всего прочего, есть и работа с регэкспами.
Т.е. 1С надо всего лишь написать обертку вокруг уже имеющихся функций, чтобы можно было пользоваться из языка 1С.
Дай ка я сейчас в порядке изучения NativeAPI попробую сделать это сам.


ОФФТОПИК: самое интересное что в этой самой библиотеке есть тот самый метод Split который кстати через те же RegExp'ы и выполняется.
Если бы в порядке изучения NativeAPI реализовать методы
1. РазложитьСтрокуВМассивПодстрок()
2. ПолучитьСтрокуИзМассиваПодстрок()

и в довесок

3. ПодставитьПараметрыВСтрокуИзМассива()

тогда такую библиотеку можно не в качестве экспериментов использовать, а в production пускать
1cmax
Сообщения: 51
Зарегистрирован: 13 июн 2012, 20:52

Re: Парсер регулярных выражений без Com

Сообщение 1cmax »

orefkov писал(а):Самый прикол, что 1С для работы с юникодом использует ICU, пакет от IBM. И в нем помимо всего прочего, есть и работа с регэкспами.
Т.е. 1С надо всего лишь написать обертку вокруг уже имеющихся функций, чтобы можно было пользоваться из языка 1С.
Дай ка я сейчас в порядке изучения NativeAPI попробую сделать это сам.

Было бы прекрасно :)
Аватара пользователя
orefkov
Администратор
Сообщения: 2052
Зарегистрирован: 24 авг 2011, 15:04

Re: Парсер регулярных выражений без Com

Сообщение orefkov »

Вот начинаю пробу.
Скачать

- Видишь суслика?
- Нет.
- И я нет. А он - есть.
(с) ДМБ

Для работы с юникодом V8 использует кроссплатформенную библиотеку ICU, которая помимо
прочего, содержит и функционал по работе с регэкспами. По какой-то непонятной оплошности,
1С не "вытащила" этот функционал "наружу", и пользоваться им из языка 1С возможности нет.

Однако, как всегда, на помощь приходят ВК.
Представляю компоненту, которая строит "мостик" из библиотеки ICU в язык 1С.
Подробнее о regexp'ах в ICU можно посмотреть здесь: http://userguide.icu-project.org/strings/regexp

Компонента выполнена по технологии "NativeAPI", и загружается так:

Код: Выделить всё

   Если не ПодключитьВнешнююКомпоненту("путь\re.dll", "RegEx", ТипВнешнейКомпоненты.Native) Тогда
      Предупреждение("Не удалось подключить ВК");
   КонецЕсли;

Работу проверял в толстом и тонком клиенте, хочется проверить на сервере.

После этого можно создавать объект "V8RegEx" и использовать его для работы. Пример:

Код: Выделить всё

   ре = Новый("V8RegEx");
   ре.Шаблон = "(?i)аа(а)";
   ре.Строка = "Ааа";
   Сообщить(ре.Совпадает());
   Сообщить(ре.КоличествоГрупп);
   Для Номер = 0 По ре.КоличествоГрупп Цикл
      Сообщить("Группа " + Номер + ": " + ре.Группа(Номер) + "  начало=" + ре.Начало(Номер) + " конец=" + ре.Конец(Номер));
   КонецЦикла;
   
   ре.Строка = "ббб";
   Сообщить(ре.Совпадает());
   
   ре.Строка = "аааббб";
   Сообщить(ре.Начинается());
   
   ре.Строка = "аааббюбдАааааАбббва";
   Пока ре.Найти() Цикл
      Сообщить("----------------------");
      Для Номер = 0 По ре.КоличествоГрупп Цикл
         Сообщить("Группа " + Номер + ": " + ре.Группа(Номер) + "  начало=" + ре.Начало(Номер) + " конец=" + ре.Конец(Номер));
      КонецЦикла;
   КонецЦикла;

Свойства объекта:
Шаблон/Pattern
строка, чтение/запись.
Задает регулярное выражение.

Строка/Input
строка, чтение/запись.
Задает исходную строку, к которой будет применятся регулярное выражение.

КоличествоГрупп
число, чтение.
Показывает количество захваченных подгрупп после применения регулярного выражения.
Нулевая группа - всё захваченное выражение.

Методы:
Совпадает()/Matches()
Возвращает - истина, если исходная строка полностью совпадает с регулярным выражением,
иначе - ложь.

Начинается()/LookingAt()
Возвращает - истина, если начало исходной строки совпадает с регулярным выражением,
иначе - ложь.

Найти() / Find()
Ищет очередное вхождение выражения в исходной строке.
Возвращает - истина, если вхождение найдено, иначе - ложь.

Группа(НомерГруппы) / Group(Idx)
Возвращает значение захваченной подгруппы.
Нулевая группа - все захваченное выражение.

Начало(НомерГруппы) / Begin(Idx)
Возвращает индекс начала позиции захваченной подгруппы.
Нулевая группа - все захваченное выражение.

Конец(НомерГруппы) / End(Idx)
Возвращает индекс следующий за конечной позицией захваченной подгруппы.
Нулевая группа - все захваченное выражение.
Аватара пользователя
kuntashov
Сообщения: 448
Зарегистрирован: 24 авг 2011, 15:53
Откуда: Саратов
Контактная информация:

Re: Парсер регулярных выражений без Com

Сообщение kuntashov »

Очень круто!
С уважением,
Александр Кунташов
Канал про 1С в Телеграме: @kuntashov_devnotes
Аватара пользователя
orefkov
Администратор
Сообщения: 2052
Зарегистрирован: 24 авг 2011, 15:04

Re: Парсер регулярных выражений без Com

Сообщение orefkov »

Саш, мне нужны баг-репорты, а не респекты :)
Хотя спасибо, конечно же.
Работает ли на сервере?
Работает ли под разными релизами 8.2 ?
Ответить