- Видишь суслика?
- Нет.
- И я не вижу. А он - есть. (с) ДМБ
Для работы с юникодом 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С.
В поставку входит два файла:
Компонента загружается так:
В 1С-Предприятии:
ПодключитьВнешнююКомпоненту("путь\rexXX.dll", "RegEx", ТипВнешнейКомпоненты.Native);
В Снегопате подключается как аддин - dll. Впишите в addins.ini строку
dll:путь к rex32.dll
Представляет регулярное выражение и служит для применения подготовленного регулярного выражения.
Сначала объекту либо через конструктор, либо через свойство Шаблон
задается регулярное выражения,
затем с помощью различных методов это выражение может неоднократно применятся к различным текстам.
После подключения компоненты можно создавать объекты для работы.
В 1С-Предприятии это делается так:
ре = Новый("V8RegEx", [Шаблон]);
Параметры:
[Шаблон] - необязательный параметр, массив с одним элементом - строкой регулярного выражения.
Шаблон = Новый Массив(1);
Шаблон[0] = "регулярное выражение";
В Снегопате объект создается через v8New:
re = v8New("V8RegEx", [Шаблон]);
Параметры:
Чтение и запись. Строка. Содержит регулярное выражение.
При присвоении свойства компонента проверяет и компилирует регулярное выражение. В случае ошибки компиляции генерируется исключение с описанием ошибки. Компонента внутри ведет кэш регулярных выражений, поэтому присвоении недавно использовавшихся шаблонов не приведет к их повторной компиляции.
Это группа методов для анализа текста регулярным выражением. Их английские названия соответственно Matches, LookingAt, Contain, Find.
Совпадает / Matches
- проверяет строку на полное совпадение с регулярным выражением.Начинается / LookingAt
- проверяет, что начало строки совпадает с регулярным выражением.Содержит / Contain
- проверяет, что часть строки совпадает с регулярным выражением.Найти / Find
- находит в строке все совпадения с регулярным выражением.Синтаксис:
результат = объект.ИмяМетода(Текст, [НачальныйИндекс])
Параметры:
Возвращают:
Если анализ успешен, возвращают объект ДеревоЗначений
, содержащий три колонки:
Строки первого уровня дерева значений содержат информацию о всём совпадении, подстроки каждой строки содержат информацию о захваченных группах.
Разделяет исходную строку на части, используя как разделитель заданное регулярное выражение.
Синтаксис:
результат = объект.Разделить(ИсходнаяСтрока);
Параметры:
Возвращает: объект Массив. Содержит получившиеся строки.
Заменяет в исходной строке все вхождения регулярного выражения на СтрокаЗамены.
Синтаксис:
результат = объект.Разделить(ИсходнаяСтрока, СтрокаЗамены);
Параметры:
Возвращает: результирующую строку.
В строке замены можно использовать ссылки на захваченные группы, как $n, где n - номер захваченной группы ($0 - все захваченное выражение).
Для упрощения перехода на новую компоненту, объект также поддерживает такой-же интерфейс, как и объект VBScript.Regexp. Это методы Exec, Test, а также свойства Multiline, Global, IgnoreCase.
Проверяет строку на вхождение регулярного совпадения.
Синтаксис:
результат = объект.Test(ПроверяемыйТекст);
Параметры:
Возвращает: Булево. Истина, если текст содержит вхожение, иначе Ложь. По действию аналогичен методу Содержит, но не возвращает информацию о вхождении.
Находит в исходной строке совпадения с регулярным выражением.
Синтаксис:
результат = объект.Execute(ПроверяемыйТекст);
Параметры:
Возвращает: Объект RegExMatches. Объект совместим по интерфейсу с результатом выполнения метода Execute объектом VBScript.Regexp. Поддерживает как обход "Для Каждого", так и доступ методом Item(Индекс). Содержит свойство Count и метод Count(), так как исходный объект так же поддерживает это свойство и метод.
Если свойство Global установлено в Истина, находит все вхождения, иначе - только первое.
Чтение и запись. Булево. Влияет на метод Execute и Replace. При установке в Истина метод будет искать либо заменять все вхождения, иначе только первое.
Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?m).
Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?i).
Служит для возращения результата методом Execute, для совместимости с интерфейсом результата этого метода в VBScript.Regexp.
Представляет из себя коллекцию объектов RegExMatch
, поддерживает обход Для Каждого
и
доступ к любому элементу через его индекс оператором []
(нумерация с 0).
Только чтение. Число. Содержит количество элементов в коллекции.
Возвращает количество элементов в коллекции.
Синтаксис:
к = результат.Количество();
Возвращает: Число. Количество элементов в коллекции.
Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.
Служит для получения элемента коллекции по его индексу.
Синтаксис:
элемент = результат.Item(Индекс);
Параметры:
Возвращает: объект RegExMatch, элемент коллекции.
Представляет один из результатов применения регулярного выражения методом Execute.
Только чтение. Строка. Содержит текст всего совпадения с регулярным выражением.
Только чтение. Число. Содержит позицию начала совпадения в исходном тексте. Нумерация позиций начинается с 0.
Только чтение. Число. Содержит длину совпадения.
Только чтение. Объект RegExSubMatches, коллекция строк - захваченных групп.
Содержит коллекцию строк - захваченных групп регулярного выражения.
Поддерживает обход Для Каждого
и доступ к любому элементу через его индекс
оператором []
(нумерация с 0).
Только чтение. Число. Содержит количество элементов в коллекции.
Возвращает количество элементов в коллекции.
Синтаксис:
к = результат.Количество();
Возвращает: Число. Количество элементов в коллекции.
Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.
Служит для получения элемента коллекции по его индексу.
Синтаксис:
элемент = результат.Item(Индекс);
Параметры:
Возвращает: Строка, элемент коллекции, текст захваченной группы.