//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем ТекущийДвижок; Перем Вычислитель; Перем ТипВхождения; Перем ЧтениеJSON; Перем СтарыйGlobal; Перем СтарыйIgnoreCase; Перем СтарыйMultiline; Перем СтарыйPattern; Функция НайтиВхождения(Знач ТекстГдеИскать) Экспорт Если ТекстГдеИскать = Неопределено Тогда ТекстГдеИскать = ""; КонецЕсли; Вхождения = Новый Массив; Если ТекущийДвижок = "VBScript" Тогда Для каждого Элемент из Вычислитель().Execute(ТекстГдеИскать) Цикл Вхождения.Добавить(Элемент); КонецЦикла; Иначе Попытка РезультатJSON = Вычислитель().MatchesJSON(ТекстГдеИскать); Исключение ВызватьИсключение Вычислитель().ОписаниеОшибки; КонецПопытки; Если ЗначениеЗаполнено(РезультатJSON) Тогда УстановитьПривилегированныйРежим(Истина); Если ТипВхождения = Неопределено Тогда ТипВхождения = ТипЗнч(ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирОболочкаРегВхождение")); ЧтениеJSON = Вычислить("Новый ЧтениеJSON"); // 8.3 #Если Сервер И Не Сервер Тогда Чтение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); Вычислитель.ВызыватьИсключения = Истина; КонецЕсли; Вычислитель.IgnoreCase = Истина; КонецЕсли; Если Ложь // Ускорение Или СтарыйGlobal <> Global Или СтарыйIgnoreCase <> IgnoreCase Или СтарыйMultiline <> Multiline Или СтарыйPattern <> Pattern Тогда ЗаполнитьЗначенияСвойств(Вычислитель, ЭтотОбъект, "Global, IgnoreCase, Multiline, Pattern"); СтарыйGlobal = Global; СтарыйIgnoreCase = IgnoreCase; СтарыйMultiline = Multiline; СтарыйPattern = Pattern; КонецЕсли; Возврат Вычислитель; КонецФункции //ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла); //ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf"; //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный ирПортативный.Открыть(); //ирПортативный КонецЕсли; //ирПортативный #Иначе //ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта //ирПортативный #КонецЕсли //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); Если ДоступенPCRE2() Тогда ТекущийДвижок = "PCRE2"; КонецЕсли; #Если Клиент Тогда Если ДоступенVBScript() Тогда ТекущийДвижок = "VBScript"; КонецЕсли; #КонецЕсли //ТекущийДвижок = "PCRE2"; // для отладки