Использование регулярных выражений (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).
     

Скачать файлы

Наименование Файл Версия Размер
VBScript-скрипт для обработки регулярных выражений
.vbs 1,68Kb
20.04.18
0
.vbs 1,68Kb Скачать

См. также

Комментарии
2. Александр Зубарь (azubar) 110 21.04.18 17:11 Сейчас в теме
гораздо проще использовать командную строку линукса, тот же grep
6. Владимир Бронников (vsbronnikov) 54 22.04.18 01:10 Сейчас в теме
(2) Когда я думал как мне реализовать регулярные выражения в Linux я рассматривал варианты использовать имеющиеся консольные утилиты типа grep, sed, awk. Но тогда мне бы пришлось знать принципы работы этих утилит.
А так на данный момент у меня на входе есть просто "регулярное выражение" (оно и в африке "регулярное выражение") и текст для анализа. При этом для Linux и Windows на входе одно и тоже.
Не хотелось бы мне grep настраивать и использовать на винде.
И чем проще grep не ясно. Приведите пример для решения моей задачи.
10. Александр Зубарь (azubar) 110 22.04.18 11:57 Сейчас в теме
(6) если с grep, sed, awk проблемы то можно использовать nodejs имхо все же проще и быстрее работать будет чем предложенный вариант.
13. binx (binx) 23.04.18 09:51 Сейчас в теме
Когда я думал как мне реализовать регулярные выражения в Linux я рассматривал варианты использовать имеющиеся консольные утилиты типа grep, sed, awk. Но тогда мне бы пришлось знать принципы работы этих утилит.

Зато оно того стоит)
3. Михаил Максимов (МихаилМ) 21.04.18 17:51 Сейчас в теме
есть ВК под линукс
https://infostart.ru/public/183084/

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

и использование без компонент xpatch https://infostart.ru/public/280340/
7. Владимир Бронников (vsbronnikov) 54 22.04.18 01:15 Сейчас в теме
(3)
1. ВК под Linux. Я читал эту статью. Даже скачал компоненту, но при подключении её даже в винде у меня возникло какое-то исключение (сейчас не вспомню). А в статье внизу приписочка "Основные планы на ближайшее будещее - сделать linux-версию" (орфография автора сохранена) и это было написано в 2014 году.
2. Реализация на языке 1С - во первых не весь синтаксис регулярных выражений поддерживается, во вторых это отдельная конфигурация, которую нужно встроить себе.
3. Наверное имелось ввиду xpath, а не xpatch. На сколько я понимаю это для работы с XML, но никак не для регулярных выражений.
4. Дмитрий Королев (ArchLord42) 62 21.04.18 20:17 Сейчас в теме

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

Немного не по теме, но :)
В эпоху расцвета машинного обучения, вместо того, чтобы е...я мучаться с регулярками проще взять питон и накидать простенькую модель и обучить их на ваших СМСках, делается это не сложно, уже давно свет увидел очень хорошую либу для машинки, называется keras - высокоуровная обертка над парой фрейморков для машнки, которая позволяет решать некоторые задачи машинного обучения, в вашем случае она более чем подходит, классификация текста вообще за вечер делается :)
8. Владимир Бронников (vsbronnikov) 54 22.04.18 01:17 Сейчас в теме
(4) Хм... интересная тема с машинным обучением. Я совсем не в теме, но частенько слышу. Может стоит попробовать. Смущает, что нужно разворачивать целую среду для работы. В любом случае после самого анализа СМС нужно ещё и интегрировать с 1С.
5. Sergey Andreev (starik-2005) 1347 21.04.18 21:33 Сейчас в теме
https://infostart.ru/public/464971/ - без внешних компонент и без дополнительного кода со стороны 1С. Но, правда, только проверка на соответствие шаблону. Работает через встроенный в 1С механизм паттернов XDTO-типов.
9. Владимир Бронников (vsbronnikov) 54 22.04.18 01:17 Сейчас в теме
(5) Читал эту статью, но просто проверки соответствия мне мало.
11. Владимир Бронников (vsbronnikov) 54 23.04.18 09:36 Сейчас в теме
Замерил время (в миллисекундах) затрачиваемое на вычисление регулярного выражения (прикрепил график).
БОльшая часть приходится именно на выполнение скрипта (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).
Прикрепленные файлы:
12. Владимир Бронников (vsbronnikov) 54 23.04.18 09:50 Сейчас в теме
(11) Сам же себе отвечаю по вопросу проверки регулярного выражения с помощью XDTO.
Мои текущие регулярные выражения описывают не всю строку текста, а до последнего совпадения.

На приведенном мной примере для работы через XDTO шаблон должен быть таким (буква "р" на конце):
(.*) (\d{2})\.(\d{2})\.(\d{2}) (\d{2}):(\d{2}) покупка (\d+\.?\d*)р (.*) Баланс: (\d+\.?\d*)р

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