RDT1C/DataProcessors/ирОболочкаРегВыражение/Ext/ObjectModule.bsl
Администратор 39b6db6c38 .
2021-05-15 18:07:01 +03:00

207 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем ТекущийДвижок;
Перем Вычислитель;
Перем ТипВхождения;
Перем ВхождениеОбразец;
Перем ЧтениеJSON;
Перем СтарыйGlobal;
Перем СтарыйIgnoreCase;
Перем СтарыйMultiline;
Перем СтарыйPattern;
Функция НайтиВхождения(Знач ТекстГдеИскать) Экспорт
Если ТекстГдеИскать = Неопределено Тогда
ТекстГдеИскать = "";
КонецЕсли;
Вхождения = Новый Массив;
Если ТекущийДвижок = "VBScript" Тогда
Для каждого Элемент из Вычислитель().Execute(ТекстГдеИскать) Цикл
Вхождения.Добавить(Элемент);
КонецЦикла;
Иначе
Попытка
РезультатJSON = Вычислитель().MatchesJSON(ТекстГдеИскать);
Исключение
ВызватьИсключение Вычислитель().ОписаниеОшибки;
КонецПопытки;
Если ЗначениеЗаполнено(РезультатJSON) Тогда
УстановитьПривилегированныйРежим(Истина);
Если ТипВхождения = Неопределено Тогда
ВхождениеОбразец = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирОболочкаРегВхождение");
ТипВхождения = ТипЗнч(ВхождениеОбразец); // Надо удерживать ВхождениеОбразец, чтобы для внешней обработки ТипВхождения не разрушался
ЧтениеJSON = Вычислить("Новый ЧтениеJSON"); //
#Если Сервер И Не Сервер Тогда
ЧтениеJSON = Новый ЧтениеJSON;
#КонецЕсли
КонецЕсли;
ЧтениеJSON.УстановитьСтроку(РезультатJSON);
Коллекция = Вычислить("ПрочитатьJSON(ЧтениеJSON, Ложь)"); // 8.3
Для Каждого Элемент Из Коллекция Цикл
Вхождение = Новый (ТипВхождения);
ЗаполнитьЗначенияСвойств(Вхождение, Элемент, "FirstIndex, Length, SubMatches, Value");
Вхождения.Добавить(Вхождение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Результат = Вхождения;
Возврат Результат;
КонецФункции
Функция Replace(Знач ТекстГдеИскать, Знач ШаблонЗамены) Экспорт
Если ТекстГдеИскать = Неопределено Тогда
ТекстГдеИскать = "";
КонецЕсли;
Если ТекущийДвижок = "VBScript" Тогда
Результат = Вычислитель().Replace(ТекстГдеИскать, ШаблонЗамены);
Иначе
Попытка
Результат = Вычислитель().Replace(ТекстГдеИскать,, ШаблонЗамены);
Исключение
// После номера группы обязательно делать не цифру. Тогда будет работать одинаково в VBScript и PCRE2. Например вместо "$152" делать "$1 52", иначе PCRE2 будет читать "ссылка на группу 152"
ВызватьИсключение Вычислитель().ОписаниеОшибки;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Test(Знач ТекстГдеИскать) Экспорт
Если ТекстГдеИскать = Неопределено Тогда
ТекстГдеИскать = "";
КонецЕсли;
Если ТекущийДвижок = "VBScript" Тогда
Результат = Вычислитель().Test(ТекстГдеИскать);
Иначе
Результат = Вычислитель().Test(ТекстГдеИскать);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КоличествоПодгрупп(Вхождение) Экспорт
Если ТипЗнч(Вхождение.SubMatches) = Тип("Массив") Тогда
Результат = Вхождение.SubMatches.Количество();
Иначе
Результат = Вхождение.SubMatches.Count;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ДоступенPCRE2() Экспорт
Возврат ирКэш.НомерВерсииПлатформыЛкс() >= 803006;
КонецФункции
Функция ДоступенVBScript() Экспорт
Возврат ирКэш.ЛиПлатформаWindowsЛкс();
КонецФункции
Функция ДоступныеДвижки() Экспорт
Список = Новый СписокЗначений;
Если ДоступенPCRE2() Тогда
// https://www.pcre.org/current/doc/html
// https://github.com/alexkmbk/RegEx1CAddin
Список.Добавить("PCRE2");
КонецЕсли;
Если ДоступенVBScript() Тогда
Список.Добавить("VBScript");
КонецЕсли;
Возврат Список;
КонецФункции
Функция ТекущийДвижок() Экспорт
Возврат ТекущийДвижок;
КонецФункции
Функция УстановитьДвижок(НовыйДвижок) Экспорт
Если ТекущийДвижок = НовыйДвижок Тогда
Возврат Истина;
КонецЕсли;
Если НовыйДвижок = "PCRE2" Тогда
Если ДоступенPCRE2() Тогда
ТекущийДвижок = НовыйДвижок;
КонецЕсли;
ИначеЕсли НовыйДвижок = "VBScript" Тогда
Если ДоступенVBScript() Тогда
ТекущийДвижок = НовыйДвижок;
КонецЕсли;
КонецЕсли;
Если ТекущийДвижок = НовыйДвижок Тогда
СтарыйGlobal = Неопределено;
СтарыйIgnoreCase = Неопределено;
СтарыйMultiline = Неопределено;
СтарыйPattern = Неопределено;
Вычислитель = Неопределено;
КонецЕсли;
Возврат ТекущийДвижок = НовыйДвижок;
КонецФункции
Функция Вычислитель()
Если Вычислитель = Неопределено Тогда
Если ТекущийДвижок = "VBScript" Тогда
Вычислитель = Новый COMОбъект("VBScript.RegExp");
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Вычислитель = мПлатформа.ПолучитьОбъектВнешнейКомпонентыИзМакета("RegEx", "AddIn.ВычислительРегВыражений.RegEx", "ВычислительРегВыражений", ТипВнешнейКомпоненты.Native);
Вычислитель.ВызыватьИсключения = Истина;
КонецЕсли;
КонецЕсли;
Если Ложь
// Ускорение
Или СтарыйGlobal <> Global
Или СтарыйIgnoreCase <> IgnoreCase
Или СтарыйMultiline <> Multiline
Или СтарыйPattern <> Pattern
Тогда
ЗаполнитьЗначенияСвойств(Вычислитель, ЭтотОбъект, "Global, IgnoreCase, Multiline, Pattern");
СтарыйGlobal = Global;
СтарыйIgnoreCase = IgnoreCase;
СтарыйMultiline = Multiline;
СтарыйPattern = Pattern;
КонецЕсли;
Возврат Вычислитель;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
IgnoreCase = Истина;
Если ДоступенPCRE2() Тогда
ТекущийДвижок = "PCRE2";
КонецЕсли;
#Если Клиент Тогда
Если ДоступенVBScript() Тогда
ТекущийДвижок = "VBScript";
КонецЕсли;
#КонецЕсли
//ТекущийДвижок = "PCRE2"; // для отладки