Функция-обертка для использования объекта 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(лСтрока,"""",,,,,,Истина,"'");

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4560    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    8455    DeerCven    15    

62

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

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

21.05.2024    56027    dimanich70    84    

174

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

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

1 стартмани

18.03.2024    7916    7    John_d    13    

59

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

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

12.02.2024    70448    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9909    ke.92@mail.ru    17    

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