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

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

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

В наличии

При обработке большого количества прайс-листов, приходится работать с разными представлениями данных. Для более простого и унифицированного метода обработки строковых данных, была написана небольшая функция для парсинга, тестирования и замены строк посредством 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(лСтрока,«»»»,,,,,,Истина,«‘»);

 

has been added to your cart:
Оформление заказа