REX Вы: nobody
Вход
  • Видишь суслика?
  • Нет.
  • И я не вижу. А он - есть. (с) ДМБ

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

Однако, как всегда, на помощь приходят ВК.

Представляю свою разработку, которая строит "мостик" из библиотеки ICU в язык 1С. Она может работать и как Native ВК, и как аддин к Снегопату.

Разработка выполнена по технологии "real native", т.е. не просто нативная по терминологии 1С, а использует "родные" методы движка 1С и притворяется штатным объектом 1С. (В семерке так работали 1С++, Rainbow и пр.)

Работа проверялась в толстом и тонком клиенте, и на серверах 32 и 64 бит. Поддерживаются релизы 8.2, 8.3.

Для работы в релизах 8.2 младше 14ого, необходимо скопировать в папку bin файлы icuXXX46.dll из каталогов bin более старших релизов 1С.

Подробнее о регулярных выражениях в ICU можно посмотреть здесь. Если сравнивать их с обычно используемыми VBScript.RegExp - регулярки от ICU более мощные, правильные, и всегда есть вместе с 1С.

В поставку входит два файла:

  • rex32.dll - для работы в 32-битных клиентах
  • rex64.dll - для работы в 64-битном сервере

Подключение компоненты

Компонента загружается так:

В 1С-Предприятии:

ПодключитьВнешнююКомпоненту("путь\rexXX.dll", "RegEx", ТипВнешнейКомпоненты.Native);

В Снегопате подключается как аддин - dll. Впишите в addins.ini строку

dll:путь к rex32.dll

Объект V8RegEx

Представляет регулярное выражение и служит для применения подготовленного регулярного выражения. Сначала объекту либо через конструктор, либо через свойство Шаблон задается регулярное выражения, затем с помощью различных методов это выражение может неоднократно применятся к различным текстам.

Создание объекта для работы

После подключения компоненты можно создавать объекты для работы.

В 1С-Предприятии это делается так:

ре = Новый("V8RegEx", [Шаблон]);

Параметры:

  • [Шаблон] - необязательный параметр, массив с одним элементом - строкой регулярного выражения.

    Шаблон = Новый Массив(1);
    Шаблон[0] = "регулярное выражение";
    

В Снегопате объект создается через v8New:

re = v8New("V8RegEx", [Шаблон]);

Параметры:

  • [Шаблон] - необязательный параметр, Строка, регулярное выражение.

Свойство Шаблон / Pattern

Чтение и запись. Строка. Содержит регулярное выражение.

При присвоении свойства компонента проверяет и компилирует регулярное выражение. В случае ошибки компиляции генерируется исключение с описанием ошибки. Компонента внутри ведет кэш регулярных выражений, поэтому присвоении недавно использовавшихся шаблонов не приведет к их повторной компиляции.

Методы Совпадает, Начинается, Содержит, Найти

Это группа методов для анализа текста регулярным выражением. Их английские названия соответственно Matches, LookingAt, Contain, Find.

  • Совпадает / Matches - проверяет строку на полное совпадение с регулярным выражением.
  • Начинается / LookingAt - проверяет, что начало строки совпадает с регулярным выражением.
  • Содержит / Contain - проверяет, что часть строки совпадает с регулярным выражением.
  • Найти / Find - находит в строке все совпадения с регулярным выражением.

Синтаксис:

результат = объект.ИмяМетода(Текст, [НачальныйИндекс])

Параметры:

  • Текст. Строка. Обязательный параметр. Содержит анализиремый текст.
  • [НачальныйИндекс]. Число. Необязательный параметр. По-умолчанию 0. Содержит стартовую позицию, начиная с которой надо анализировать текст. Нумерация позиций в отличии от 1С начинается с 0.

Возвращают:

Если анализ успешен, возвращают объект ДеревоЗначений, содержащий три колонки:

  • Текст / Value. Текст совпадения.
  • Начало / FirstIndex. Начальная позиция совпадения в исходной строке.
  • Длина / Length. Длина совпадения.

Строки первого уровня дерева значений содержат информацию о всём совпадении, подстроки каждой строки содержат информацию о захваченных группах.

Метод Разделить / Split

Разделяет исходную строку на части, используя как разделитель заданное регулярное выражение.

Синтаксис:

результат = объект.Разделить(ИсходнаяСтрока);

Параметры:

  • ИсходнаяСтрока. Строка. Текст, котором необходимо разбить на части.

Возвращает: объект Массив. Содержит получившиеся строки.

Метод Заменить / Replace

Заменяет в исходной строке все вхождения регулярного выражения на СтрокаЗамены.

Синтаксис:

результат = объект.Заменить(ИсходнаяСтрока, СтрокаЗамены);

Параметры:

  • ИсходнаяСтрока. Строка. Текст, в котором необходимо выполнить замены.
  • СтрокаЗамены. Строка. Текст, который будет вставляться в места замены.

Возвращает: результирующую строку.

В строке замены можно использовать ссылки на захваченные группы, как $n, где n - номер захваченной группы ($0 - все захваченное выражение).

Совместимость с VBScript.Regexp

Для упрощения перехода на новую компоненту, объект также поддерживает такой-же интерфейс, как и объект VBScript.Regexp. Это методы Exec, Test, а также свойства Multiline, Global, IgnoreCase.

Метод Test / Проверить

Проверяет строку на вхождение регулярного совпадения.

Синтаксис:

результат = объект.Test(ПроверяемыйТекст);

Параметры:

  • ПроверяемыйТекст. Строка. Текст для проверки.

Возвращает: Булево. Истина, если текст содержит вхожение, иначе Ложь. По действию аналогичен методу Содержит, но не возвращает информацию о вхождении.

Метод Execute / Выполнить

Находит в исходной строке совпадения с регулярным выражением.

Синтаксис:

результат = объект.Execute(ПроверяемыйТекст);

Параметры:

  • ПроверяемыйТекст. Строка. Текст для проверки.

Возвращает: Объект RegExMatches. Объект совместим по интерфейсу с результатом выполнения метода Execute объектом VBScript.Regexp. Поддерживает как обход "Для Каждого", так и доступ методом Item(Индекс). Содержит свойство Count и метод Count(), так как исходный объект так же поддерживает это свойство и метод.

Если свойство Global установлено в Истина, находит все вхождения, иначе - только первое.

Свойство Global / Глобальный

Чтение и запись. Булево. Влияет на метод Execute и Replace. При установке в Истина метод будет искать либо заменять все вхождения, иначе только первое.

Свойство Multilie / Многострочный

Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?m).

Свойство IgnoreCase / НеУчитыватьРегистр

Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?i).

Объект RegExMatches

Служит для возращения результата методом Execute, для совместимости с интерфейсом результата этого метода в VBScript.Regexp.

Представляет из себя коллекцию объектов RegExMatch, поддерживает обход Для Каждого и доступ к любому элементу через его индекс оператором [] (нумерация с 0).

Свойство Count / Количество

Только чтение. Число. Содержит количество элементов в коллекции.

Метод Count / Количество.

Возвращает количество элементов в коллекции.

Синтаксис:

к = результат.Количество();

Возвращает: Число. Количество элементов в коллекции.

Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.

Метод Item / Получить

Служит для получения элемента коллекции по его индексу.

Синтаксис:

элемент = результат.Item(Индекс);

Параметры:

  • Индекс. Число. Номер элемента в коллекции, начиная с 0.

Возвращает: объект RegExMatch, элемент коллекции.

Объект RegExMatch

Представляет один из результатов применения регулярного выражения методом Execute.

Свойство Value / Текст

Только чтение. Строка. Содержит текст всего совпадения с регулярным выражением.

Свойство FirstIndex / Начало

Только чтение. Число. Содержит позицию начала совпадения в исходном тексте. Нумерация позиций начинается с 0.

Свойство Length / Длина

Только чтение. Число. Содержит длину совпадения.

Свойство SubMatches / Подгруппы

Только чтение. Объект RegExSubMatches, коллекция строк - захваченных групп.

Объект RegExSubMatches

Содержит коллекцию строк - захваченных групп регулярного выражения. Поддерживает обход Для Каждого и доступ к любому элементу через его индекс оператором [] (нумерация с 0).

Свойство Count / Количество

Только чтение. Число. Содержит количество элементов в коллекции.

Метод Count / Количество.

Возвращает количество элементов в коллекции.

Синтаксис:

к = результат.Количество();

Возвращает: Число. Количество элементов в коллекции.

Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.

Метод Item / Получить

Служит для получения элемента коллекции по его индексу.

Синтаксис:

элемент = результат.Item(Индекс);

Параметры:

  • Индекс. Число. Номер элемента в коллекции, начиная с 0.

Возвращает: Строка, элемент коллекции, текст захваченной группы.