Функция-обертка для использования объекта 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С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    25079    dimanich70    82    

149

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

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

1 стартмани

18.03.2024    4496    3    John_d    11    

57

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

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

12.02.2024    25361    atdonya    25    

58

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

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

30.11.2023    6064    ke.92@mail.ru    17    

65

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

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

28.08.2023    16533    YA_418728146    8    

170

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

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

2 стартмани

22.08.2023    4257    73    progmaster    10    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 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    19129    180    sapervodichka    112    

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