Функция-обертка для использования объекта 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    31425    dimanich70    83    

152

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

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

1 стартмани

18.03.2024    5052    6    John_d    11    

57

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

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

12.02.2024    35583    atdonya    29    

62

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

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

30.11.2023    6669    ke.92@mail.ru    17    

66

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

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

28.08.2023    18313    YA_418728146    8    

172

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

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

2 стартмани

22.08.2023    4901    80    progmaster    11    

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    19974    191    sapervodichka    113    

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