mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 13:14:11 +00:00
129 lines
17 KiB
HTML
129 lines
17 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16476"></meta></head><body>
|
||
<h1>REX</h1>
|
||
<blockquote>
|
||
<ul><li>Видишь суслика?
|
||
</li><li>Нет.
|
||
</li><li>И я не вижу. А он - есть. (с) ДМБ</li></ul></blockquote>
|
||
<p>Для работы с юникодом V8 использует кроссплатформенную библиотеку ICU, которая помимо прочего, содержит и функционал по работе с регулярными выражениями. По какой-то неизвестной причине, 1С не "вытащила" этот функционал "наружу", и пользоваться им из языка 1С возможности нет.</p>
|
||
<p>Однако, как всегда, на помощь приходят ВК.</p>
|
||
<p>Представляю свою разработку, которая строит "мостик" из библиотеки ICU в язык 1С. Она может работать и как Native ВК, и как аддин к Снегопату.</p>
|
||
<p>Разработка выполнена по технологии "real native", т.е. не просто нативная по терминологии 1С, а использует "родные" методы движка 1С и притворяется штатным объектом 1С. (В семерке так работали 1С++, Rainbow и пр.)</p>
|
||
<p>Работа проверялась в толстом и тонком клиенте, и на серверах 32 и 64 бит. Поддерживаются релизы 8.2, 8.3.</p>
|
||
<p>Для работы в релизах 8.2 младше 14ого, необходимо скопировать в папку <code>bin</code> файлы <code>icuXXX46.dll</code> из каталогов <code>bin</code> более старших релизов 1С.</p>
|
||
<p>Подробнее о регулярных выражениях в ICU можно посмотреть <a href="http://userguide.icu-project.org/strings/regexp">здесь</a>. Если сравнивать их с обычно используемыми <code>VBScript.RegExp</code> - регулярки от ICU более мощные, правильные, и всегда есть вместе с 1С.</p>
|
||
<p>В поставку входит два файла:</p>
|
||
<ul><li>rex32.dll - для работы в 32-битных клиентах
|
||
</li><li>rex64.dll - для работы в 64-битном сервере</li></ul><h2>Подключение компоненты</h2>
|
||
<p>Компонента загружается так:</p>
|
||
<p>В 1С-Предприятии:</p><pre><code>ПодключитьВнешнююКомпоненту("путь\rexXX.dll", "RegEx", ТипВнешнейКомпоненты.Native);
|
||
</code></pre>
|
||
<p>В Снегопате подключается как аддин - dll. Впишите в addins.ini строку</p><pre><code>dll:путь к rex32.dll
|
||
</code></pre>
|
||
<h2>Объект V8RegEx</h2>
|
||
<p>Представляет регулярное выражение и служит для применения подготовленного регулярного выражения. Сначала объекту либо через конструктор, либо через свойство <code>Шаблон</code> задается регулярное выражения, затем с помощью различных методов это выражение может неоднократно применятся к различным текстам.</p>
|
||
<h3>Создание объекта для работы</h3>
|
||
<p>После подключения компоненты можно создавать объекты для работы.</p>
|
||
<p>В 1С-Предприятии это делается так:</p><pre><code>ре = Новый("V8RegEx", [Шаблон]);
|
||
</code></pre>
|
||
<p>Параметры:</p>
|
||
<ul><li>
|
||
<p>[Шаблон] - необязательный параметр, массив с одним элементом - строкой регулярного выражения.</p><pre><code>Шаблон = Новый Массив(1);
|
||
Шаблон[0] = "регулярное выражение";
|
||
</code></pre></li></ul><p>В Снегопате объект создается через v8New:</p><pre><code>re = v8New("V8RegEx", [Шаблон]);
|
||
</code></pre>
|
||
<p>Параметры:</p>
|
||
<ul><li>[Шаблон] - необязательный параметр, Строка, регулярное выражение.</li></ul><h3>Свойство Шаблон / Pattern</h3>
|
||
<p>Чтение и запись. Строка. Содержит регулярное выражение.</p>
|
||
<p>При присвоении свойства компонента проверяет и компилирует регулярное выражение. В случае ошибки компиляции генерируется исключение с описанием ошибки. Компонента внутри ведет кэш регулярных выражений, поэтому присвоении недавно использовавшихся шаблонов не приведет к их повторной компиляции.</p>
|
||
<h3>Методы Совпадает, Начинается, Содержит, Найти</h3>
|
||
<p>Это группа методов для анализа текста регулярным выражением. Их английские названия соответственно Matches, LookingAt, Contain, Find.</p>
|
||
<ul><li><code>Совпадает / Matches</code> - проверяет строку на полное совпадение с регулярным выражением.
|
||
</li><li><code>Начинается / LookingAt</code> - проверяет, что начало строки совпадает с регулярным выражением.
|
||
</li><li><code>Содержит / Contain</code> - проверяет, что часть строки совпадает с регулярным выражением.
|
||
</li><li><code>Найти / Find</code> - находит в строке все совпадения с регулярным выражением.</li></ul><p><strong>Синтаксис:</strong></p><pre><code>результат = объект.ИмяМетода(Текст, [НачальныйИндекс])
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>Текст. Строка. Обязательный параметр. Содержит анализиремый текст.
|
||
</li><li>[НачальныйИндекс]. Число. Необязательный параметр. По-умолчанию 0. Содержит стартовую позицию, начиная с которой надо анализировать текст. Нумерация позиций в отличии от 1С начинается с <strong>0</strong>. </li></ul><p><strong>Возвращают:</strong></p>
|
||
<p>Если анализ успешен, возвращают объект <code>ДеревоЗначений</code>, содержащий три колонки:</p>
|
||
<ul><li>Текст / Value. Текст совпадения.
|
||
</li><li>Начало / FirstIndex. Начальная позиция совпадения в исходной строке.
|
||
</li><li>Длина / Length. Длина совпадения.</li></ul><p>Строки первого уровня дерева значений содержат информацию о всём совпадении, подстроки каждой строки содержат информацию о захваченных группах.</p>
|
||
<h3>Метод Разделить / Split</h3>
|
||
<p>Разделяет исходную строку на части, используя как разделитель заданное регулярное выражение.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>результат = объект.Разделить(ИсходнаяСтрока);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>ИсходнаяСтрока. Строка. Текст, котором необходимо разбить на части.</li></ul><p><strong>Возвращает:</strong> объект Массив. Содержит получившиеся строки.</p>
|
||
<h3>Метод Заменить / Replace</h3>
|
||
<p>Заменяет в исходной строке все вхождения регулярного выражения на СтрокаЗамены.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>результат = объект.Разделить(ИсходнаяСтрока, СтрокаЗамены);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>ИсходнаяСтрока. Строка. Текст, в котором необходимо выполнить замены.
|
||
</li><li>СтрокаЗамены. Строка. Текст, который будет вставляться в места замены.</li></ul><p><strong>Возвращает:</strong> результирующую строку.</p>
|
||
<p>В строке замены можно использовать ссылки на захваченные группы, как $n, где n - номер захваченной группы ($0 - все захваченное выражение).</p>
|
||
<h3>Совместимость с VBScript.Regexp</h3>
|
||
<p>Для упрощения перехода на новую компоненту, объект также поддерживает такой-же интерфейс, как и объект VBScript.Regexp. Это методы Exec, Test, а также свойства Multiline, Global, IgnoreCase.</p>
|
||
<h3>Метод Test / Проверить</h3>
|
||
<p>Проверяет строку на вхождение регулярного совпадения.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>результат = объект.Test(ПроверяемыйТекст);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>ПроверяемыйТекст. Строка. Текст для проверки.</li></ul><p><strong>Возвращает:</strong> Булево. Истина, если текст содержит вхожение, иначе Ложь. По действию аналогичен методу Содержит, но не возвращает информацию о вхождении.</p>
|
||
<h3>Метод Execute / Выполнить</h3>
|
||
<p>Находит в исходной строке совпадения с регулярным выражением.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>результат = объект.Execute(ПроверяемыйТекст);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>ПроверяемыйТекст. Строка. Текст для проверки.</li></ul><p><strong>Возвращает:</strong> Объект RegExMatches. Объект совместим по интерфейсу с результатом выполнения метода Execute объектом VBScript.Regexp. Поддерживает как обход "Для Каждого", так и доступ методом Item(Индекс). Содержит свойство Count и метод Count(), так как исходный объект так же поддерживает это свойство и метод.</p>
|
||
<p>Если свойство Global установлено в Истина, находит все вхождения, иначе - только первое.</p>
|
||
<h3>Свойство Global / Глобальный</h3>
|
||
<p>Чтение и запись. Булево. Влияет на метод Execute и Replace. При установке в Истина метод будет искать либо заменять все вхождения, иначе только первое.</p>
|
||
<h3>Свойство Multilie / Многострочный</h3>
|
||
<p>Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?m).</p>
|
||
<h3>Свойство IgnoreCase / НеУчитыватьРегистр</h3>
|
||
<p>Чтение и запись. Булево. Влияет на все методы. При установке в Истина в начало регулярного выражения добавляется флаг (?i).</p>
|
||
<h2>Объект RegExMatches</h2>
|
||
<p>Служит для возращения результата методом Execute, для совместимости с интерфейсом результата этого метода в VBScript.Regexp.</p>
|
||
<p>Представляет из себя коллекцию объектов <code>RegExMatch</code>, поддерживает обход <code>Для Каждого</code> и доступ к любому элементу через его индекс оператором <code>[]</code> (нумерация с 0).</p>
|
||
<h3>Свойство Count / Количество</h3>
|
||
<p>Только чтение. Число. Содержит количество элементов в коллекции.</p>
|
||
<h3>Метод Count / Количество.</h3>
|
||
<p>Возвращает количество элементов в коллекции.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>к = результат.Количество();
|
||
</code></pre>
|
||
<p><strong>Возвращает:</strong> Число. Количество элементов в коллекции.</p>
|
||
<p>Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.</p>
|
||
<h3>Метод Item / Получить</h3>
|
||
<p>Служит для получения элемента коллекции по его индексу.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>элемент = результат.Item(Индекс);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>Индекс. Число. Номер элемента в коллекции, начиная с 0.</li></ul><p><strong>Возвращает:</strong> объект RegExMatch, элемент коллекции.</p>
|
||
<h2>Объект RegExMatch</h2>
|
||
<p>Представляет один из результатов применения регулярного выражения методом Execute.</p>
|
||
<h3>Свойство Value / Текст</h3>
|
||
<p>Только чтение. Строка. Содержит текст всего совпадения с регулярным выражением.</p>
|
||
<h3>Свойство FirstIndex / Начало</h3>
|
||
<p>Только чтение. Число. Содержит позицию начала совпадения в исходном тексте. Нумерация позиций начинается с 0.</p>
|
||
<h3>Свойство Length / Длина</h3>
|
||
<p>Только чтение. Число. Содержит длину совпадения.</p>
|
||
<h3>Свойство SubMatches / Подгруппы</h3>
|
||
<p>Только чтение. Объект RegExSubMatches, коллекция строк - захваченных групп.</p>
|
||
<h2>Объект RegExSubMatches</h2>
|
||
<p>Содержит коллекцию строк - захваченных групп регулярного выражения. Поддерживает обход <code>Для Каждого</code> и доступ к любому элементу через его индекс оператором <code>[]</code> (нумерация с 0).</p>
|
||
<h3>Свойство Count / Количество</h3>
|
||
<p>Только чтение. Число. Содержит количество элементов в коллекции.</p>
|
||
<h3>Метод Count / Количество.</h3>
|
||
<p>Возвращает количество элементов в коллекции.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>к = результат.Количество();
|
||
</code></pre>
|
||
<p><strong>Возвращает:</strong> Число. Количество элементов в коллекции.</p>
|
||
<p>Коллекция имеет и метод, и свойство Count для совместимости со старым кодом.</p>
|
||
<h3>Метод Item / Получить</h3>
|
||
<p>Служит для получения элемента коллекции по его индексу.</p>
|
||
<p><strong>Синтаксис:</strong></p><pre><code>элемент = результат.Item(Индекс);
|
||
</code></pre>
|
||
<p><strong>Параметры:</strong></p>
|
||
<ul><li>Индекс. Число. Номер элемента в коллекции, начиная с 0.</li></ul><p><strong>Возвращает:</strong> Строка, элемент коллекции, текст захваченной группы.</p></body></html> |