Использование регулярных выражений (RegExp) в Linux



Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

Задача: Необходимо из 1С использовать регулярные выражения (RegExp) в Linux.
Проблема: В Windows можно использовать COM-объект VBScript.Regexp. В Linux нет COM-объектов.
Решение: Устанавливаем Wine и выполняем скрипт через командную строку.
Исходные данные: Клиент-серверный вариант установки 1С. Клиенты любые, сервер — Linux (в моем случае Debian Wheezy).

Теперь по шагам

1. Установим wine (https://wiki.winehq.org/Debian).

wine ставится на i386 архитектуру.
Проверим, что она у нас стоит:

# dpkg --print-architecture

Если нет, то установим (за подробностями сюда https://wiki.debian.org/ru/Multiarch/HOWTO):

# dpkg --add-architecture i386

Установим репозиторий для установки:

wget -nc https://dl.winehq.org/wine-builds/Release.key
apt-key add Release.key

Добавим в список пакетов (/etc/apt/sources.list или отдельным файлом в папку /etc/apt/sources.list.d) строчку:
deb https://dl.winehq.org/wine-builds/debian/ DISTRO main

где DISTRO — имя вашего дистрибутива (у меня wheezy)

Собственно установка:

# apt-get update
# apt-get install --install-recommends winehq-stable

При попытке установить пакет wine на wheezy возникла ошибка:
"The method driver /usr/lib/apt/methods/https could not be found."
Репозиторий winehq использует протокол https для загрузки.

Решается установкой нужного транспорта на apt:

# apt-get install apt-transport-https

Установим полезный скрипт winetricks (с сайта, т.к. в репозитории может быть сильно устаревшим):

# wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
# chmod +x winetricks
# cp winetricks /usr/bin

Для пользователя (usr1cv8), от которого запущен сервер 1С и  будет запускаться wine настраиваем его окружение:

# su - usr1cv8
$ winecfg

Установим библиотеку для работы с VBScript.

$ winetricks wsh56vb

Со временем может выйти более новая версия библиотеки, тогда будет сообщение типа: "Calling wsh56 is deprecated, please use wsh57 instead".
В этом случае устанавливаем указанную версию библиотеки (в данном случае wsh57vb).

Для платформы x64 сперва создаем окружение win32 (требуется для VBScript).
Здесь создается отдельная папка (на свой вкус, я сделал в домашней папке пользователя 1С) ~/.wine32 с библиотеками своей архитектуры.

$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg
$ WINEPREFIX=~/.wine32 winetricks wsh56vb

Теперь о том, как я это использую

У меня есть задачи разбирать полученные СМС и по полученным совпадениям создавать и заполнять тот или иной документ.
Для этого я создаю правила обработки, в котором задаю регулярное выражение. При анализе текста СМС в случае совпадения с регулярным выражением я разбиваю текст СМС на группы (match) и подгруппы (submatch) и использую эти значения для заполнения нужного мне документа.

Скрипт VBScript и его вызов приведен на скриншотах к статье.

Командная строка вызова скрипта:

$ wine cscript.exe z:ИмяФайлаСкрипта z:ИмяФайлаШаблона z:ИмяФайлаАнализируемогоТекста > ИмяФайлаРезультата 2> ИмяФайлаОшибкок

где

  • ИмяФайлаСкрипта — полное имя файла VBScript-скрипта
  • ИмяФайлаШаблона — полное имя файла, в которое записывается шаблон регулярного выряжения
  • ИмяФайлаАнализируемогоТекста — полное имя файла, в которое записывается анализируемый текст
  • ИмяФайлаРезультата — файл, в который перенаправляем вывод работы скрипта (например через WShell.Echo)
  • ИмяФайлаОшибкок — файл, в который будет записаны возможные ошибки обработки скрипта
  • Первые 3 файла предваряем буквой диска "z:" (z — это корень файловой системы для wine).

Примечания:

  1. Код выполняется на сервере, т.е. можно использовать в качестве регламентного задания 1С.
  2. Описанный способ так же работает и в Windows, но для этого возможно понадобятся разрешения администратора на выполнение скриптов (csсript.exe).
  3. Работа ведется через файлы (соответственно медленнее, чем через COM-объекты, вызываемые из 1С в Windows).
     

12 Comments

  1. azubar

    гораздо проще использовать командную строку линукса, тот же grep

    Reply
  2. МихаилМ

    есть ВК под линукс

    https://infostart.ru/public/183084/

    реализация на языке 1с8 https://infostart.ru/public/328736/

    и использование без компонент xpatch https://infostart.ru/public/280340/

    Reply
  3. ArchLord42

    У меня есть задачи разбирать полученные СМС и по полученным совпадениям создавать и заполнять тот или иной документ.

    Для этого я создаю правила обработки, в котором задаю регулярное выражение. При анализе текста СМС в случае совпадения с регулярным выражением я разбиваю текст СМС на группы (match) и подгруппы (submatch) и использую эти значения для заполнения нужного мне документа.

    Немного не по теме, но 🙂

    В эпоху расцвета машинного обучения, вместо того, чтобы е…я мучаться с регулярками проще взять питон и накидать простенькую модель и обучить их на ваших СМСках, делается это не сложно, уже давно свет увидел очень хорошую либу для машинки, называется keras — высокоуровная обертка над парой фрейморков для машнки, которая позволяет решать некоторые задачи машинного обучения, в вашем случае она более чем подходит, классификация текста вообще за вечер делается 🙂

    Reply
  4. starik-2005

    https://infostart.ru/public/464971/ — без внешних компонент и без дополнительного кода со стороны 1С. Но, правда, только проверка на соответствие шаблону. Работает через встроенный в 1С механизм паттернов XDTO-типов.

    Reply
  5. vsbronnikov

    (2) Когда я думал как мне реализовать регулярные выражения в Linux я рассматривал варианты использовать имеющиеся консольные утилиты типа grep, sed, awk. Но тогда мне бы пришлось знать принципы работы этих утилит.

    А так на данный момент у меня на входе есть просто «регулярное выражение» (оно и в африке «регулярное выражение») и текст для анализа. При этом для Linux и Windows на входе одно и тоже.

    Не хотелось бы мне grep настраивать и использовать на винде.

    И чем проще grep не ясно. Приведите пример для решения моей задачи.

    Reply
  6. vsbronnikov

    (3)

    1. ВК под Linux. Я читал эту статью. Даже скачал компоненту, но при подключении её даже в винде у меня возникло какое-то исключение (сейчас не вспомню). А в статье внизу приписочка «Основные планы на ближайшее будещее — сделать linux-версию» (орфография автора сохранена) и это было написано в 2014 году.

    2. Реализация на языке 1С — во первых не весь синтаксис регулярных выражений поддерживается, во вторых это отдельная конфигурация, которую нужно встроить себе.

    3. Наверное имелось ввиду xpath, а не xpatch. На сколько я понимаю это для работы с XML, но никак не для регулярных выражений.

    Reply
  7. vsbronnikov

    (4) Хм… интересная тема с машинным обучением. Я совсем не в теме, но частенько слышу. Может стоит попробовать. Смущает, что нужно разворачивать целую среду для работы. В любом случае после самого анализа СМС нужно ещё и интегрировать с 1С.

    Reply
  8. vsbronnikov

    (5) Читал эту статью, но просто проверки соответствия мне мало.

    Reply
  9. azubar

    (6) если с grep, sed, awk проблемы то можно использовать nodejs имхо все же проще и быстрее работать будет чем предложенный вариант.

    Reply
  10. vsbronnikov

    Замерил время (в миллисекундах) затрачиваемое на вычисление регулярного выражения (прикрепил график).

    БОльшая часть приходится именно на выполнение скрипта (500..1000 мс).

    Попробовал сперва тестировать текст с помощью решения из комментария (5).

    Но в ответ на все имеющиеся рабочие шаблоны ошибка «Значение не соответствует образцу».

    Вот например:

    (.*) (d{2}).(d{2}).(d{2}) (d{2}):(d{2}) покупка (d+.?d*)р (.*) Баланс: (d+.?d*)

    Ошибка проверки данных XDTO:

    Значение: ‘VISA0000 22.04.18 16:16 покупка 80р M-N EVSEY Баланс: 100.00р’ не соответствует простому типу: {sample-my-package}testtypes

    Значение не соответствует образцу

    При том, что текст соответствует данному шаблону (можно проверить на популярном «online regexp tester», который 101).

    Reply
  11. vsbronnikov

    (11) Сам же себе отвечаю по вопросу проверки регулярного выражения с помощью XDTO.

    Мои текущие регулярные выражения описывают не всю строку текста, а до последнего совпадения.

    На приведенном мной примере для работы через XDTO шаблон должен быть таким (буква «р» на конце):

    (.*) (d{2}).(d{2}).(d{2}) (d{2}):(d{2}) покупка (d+.?d*)р (.*) Баланс: (d+.?d*)р

    Проверка с помощью XDTO сильно ускорит быстродействие. Т.е. все проверки делаются с помощью XDTO, а разбор текста на группы скриптом только 1 раз.

    Reply
  12. binx
    Когда я думал как мне реализовать регулярные выражения в Linux я рассматривал варианты использовать имеющиеся консольные утилиты типа grep, sed, awk. Но тогда мне бы пришлось знать принципы работы этих утилит.

    Зато оно того стоит)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *