Функция-обертка для использования объекта VBScript.RegExp в 1С v8

13.08.13

Разработка - Универсальные функции

При обработке большого количества прайс-листов, приходится работать с разными представлениями данных. Для более простого и унифицированного метода обработки строковых данных, была написана небольшая функция для парсинга, тестирования и замены строк посредством RegExp выражений.

кОписанная ниже функция была написана в ходе работы и взята из реального рабочего проекта.

Для понимания регуляных выражений можно почитать литературу в итернете.

Также есть простой пример работы с регулярными выражениями 165085

Для проверки регулярных выражений использую RegexBuddy

 

Функция выполняет 3 основных вещи:

1. Тестирование строки по шаблону

    Результат - Истина / Ложь

2. Замена в строке по шаблону

    Результат - строка

3. Получение значений найденых по шаблону:

    Результат - список значений с найденными вхождениями


Параметры:

СтрокаПоиска = ""            - строка, над которой необходимо выполнить действие
ШаблонПоиска = ""            - шаблон, по которому необходимо выполнить действие
Отладка = 0                  - выводить отладочные сообщения при внедрении функции
ВывестиГруппы = Ложь         - в случае работы с группами в выражениях формируютя группы найденых значений
Тестировать = Ложь           - выполнить тестирование по шаблону
RegExp = Неопределено        - при частом использовании функции (в циклах) падает производительность лучше заранее определить СОМ-объект и передавать в качестве параметра
СоздаватьКомОбъект = Истина  - управление необходимостью создания нового СОМ-объект внутри функции
ВыполнитьЗамену = Ложь       - выполняется замена в строке поиска 
СтрокаЗамены = ""            - строка на которую будут заменены найденные выражения


Сама функция:

Функция глRegExp(СтрокаПоиска = ""
               
,ШаблонПоиска = ""
               
,Отладка = Ложь
               
,ВывестиГруппы = Ложь
                ,
Тестировать = Ложь
                ,
RegExp = Неопределено
                ,
СоздаватьКомОбъект = Истина
                ,
ВыполнитьЗамену = Ложь
                ,
СтрокаЗамены = "") Экспорт
   
спкРезультат = Новый СписокЗначений;
    Если (
СтрокаПоиска = "") ИЛИ (ШаблонПоиска = "") Тогда
       
спкРезультат.Добавить("");
        Возврат
спкРезультат;
    КонецЕсли;

    Если
СоздаватьКомОбъект Тогда
       
RegExp = Новый COMОбъект("VBScript.RegExp");
    КонецЕсли;

   
RegExp.IgnoreCase = Истина; //Игнорировать регистр
   
RegExp.Global = Истина; //Поиск всех вхождений шаблона
   
RegExp.MultiLine = Истина; //Многострочный режим

   
RegExp.Pattern = ШаблонПоиска;

    Если
Тестировать Тогда
        Возврат
RegExp.Test(СтрокаПоиска);
    КонецЕсли;

    Если
ВыполнитьЗамену Тогда
        Возврат
RegExp.Replace(СтрокаПоиска,СтрокаЗамены);
    КонецЕсли;

   
Matches=RegExp.Execute(СтрокаПоиска);
   
ЧислоВхождений=Matches.Count();
    Если
ЧислоВхождений>0 Тогда
        Для
к = 0 По ЧислоВхождений-1 Цикл
           
Match = Matches.Item(к);
            Если
ВывестиГруппы Тогда
               
ЧислоВложВхождений = Match.SubMatches.Count();
                Если
ЧислоВложВхождений > 0 Тогда
                   
подСписок = Новый СписокЗначений;
                    Для
к2 = 0 По ЧислоВложВхождений-1 Цикл
                       
SubMatch = Match.SubMatches.Item(к2);
                       
подСписок.Добавить(SubMatch);
                        Если
Отладка Тогда
                           
Сообщить("Результат: " + SubMatch + " Шаблон: " + ШаблонПоиска + " Строка поиска: " + СтрокаПоиска);
                        КонецЕсли;
                    КонецЦикла;
                   
спкРезультат.Добавить(подСписок,Match.Value);
                    Продолжить;
                КонецЕсли;
            Иначе
               
спкРезультат.Добавить(Match.Value);
                Если
Отладка Тогда
                   
Сообщить("Результат: " + Match.Value + " Шаблон: " + ШаблонПоиска + " Строка поиска: " + СтрокаПоиска);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    Иначе
        Если
Отладка Тогда
           
//Сообщить("Вхождений шаблона не найдено - " + ШаблонПоиска);
       
КонецЕсли;
    КонецЕсли;

    Если
спкРезультат.Количество() = 0 Тогда
       
спкРезультат.Добавить("");
    КонецЕсли;

    Возврат
спкРезультат;

КонецФункции

 

Примеры использования:

а) Тестирование и получение по отдельным группам значений даты: 

    лRegExp = Новый COMОбъект("VBScript.RegExp");
   
_ШаблонДДММГГ = "\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.]((19|20)?[0-9]{2})\b";
   
_СтррокаСДатой = "12.08.3013 г.";
    Если
глRegExp(_СтррокаСДатой,_ШаблонДДММГГ,,,Истина,лRegExp,Ложь) Тогда // проверка даты "дд.мм.гг(гг)"
        // брать группы для даты Дата(2,1,0)
       
_спкГрупп = глRegExp(_СтррокаСДатой,_ШаблонДДММГГ,,Истина,,лRegExp,Ложь)[0].Значение;
       
_ОжидаемаяДатаПоставки = Дата(Число(_спкГрупп[2].Значение)
                                     ,
Число(_спкГрупп[1].Значение)
                                     ,
Число(_спкГрупп[0].Значение));
    Иначе
       
_ОжидаемаяДатаПоставки = Дата("00010101");
    КонецЕсли;

 

б) Замена по шаблону:

    лСтрока = "Пример строки с заменой ""двойных"" кавычек на 'одинарные'";
    лСтрока = глRegExp(лСтрока,"""",,,,,,Истина,"'");

 

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2665    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4598    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3956    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8807    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16141    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4709 13.08.13 14:09 Сейчас в теме
Баян. Ищите нормальные публикации по regexp, там были реально полезные вещи, а это сгодится лишь как "ещё одна иллюстрация".
2. shmellevich 134 13.08.13 20:15 Сейчас в теме
(1) Yashazz, Реальные полезные вещи в студию пожалуйста.
Я и не говорил, что моя публикация панацея во всех ситуациях по regexp, а просто "проиллюстрировал", как можно использовать regexp в работе со строками.
Реально полезная вещь - это возможность использовать regexp через нативные (родные) методы 1С, но пока есть 1 вариант RexV8, и за то спасибо автору компоненты.
3. Yashazz 4709 14.08.13 11:41 Сейчас в теме
(2) Поисковый движок ИС вам в руки.
Как частный иллюстративный пример это ещё покатит, но, серьёзно говорю, было больше и лучше.
4. ya.Avoronov 115 19.01.15 11:58 Сейчас в теме
5. lolik123 18.11.15 22:31 Сейчас в теме
Спасибо очень пригодится.
Оставьте свое сообщение