helpf.pro
Регистрация
 +1 
Распечатать

Использование регулярных выражений (RegExp) в 1С

Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Код 1C v 8.х
 RegExp = Новый COMОбъект("VBScript.RegExp");   


Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.

Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.
Код 1C v 7.x
 ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки
Процедура RegExp_Exec()
    
    //Для 1С 7.7:
    Истина=-1;
    Ложь=0;
    RegExp = CreateObject("VBScript.RegExp");
    
    RegExp.IgnoreCase = Ложь; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Ложь; //Многострочный режим
    
    RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
    Matches=RegExp.Execute("Это <hr> строка <br> с тегами HTML");
    ЧислоВхождений=Matches.Count();
    Если ЧислоВхождений>0 Тогда 
        Для к = 0 По ЧислоВхождений-1 Цикл
            Match = Matches.Item(к);
            Сообщить("Найден тег:"+ Match.Value);
        КонецЦикла;
    Иначе
        Сообщить("Вхождений шаблона не найдено");
    КонецЕсли;
    //Выдаст в окно сообщений:    
    //Найден тег:<hr>
    //Найден тег:<br>    
КонецПроцедуры


Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Код 1C v 7.x
 ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки с использованием подвыражений
Процедура RegExp_Exec1()
    
    //Для 1С 7.7:
    Истина=-1;
    Ложь=0;
    RegExp = CreateObject("VBScript.RegExp");
    
    RegExp.IgnoreCase = Ложь; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Ложь; //Многострочный режим
    
    RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; //Ищем теги HTML, а также текст до и после тега
    Matches=RegExp.Execute("  <tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>");
    ЧислоВхождений=Matches.Count();
    Если ЧислоВхождений>0 Тогда 
        Для к = 0 По ЧислоВхождений-1 Цикл
            Match = Matches.Item(к);
            
            SubMatches = Match.SubMatches;
            ЧислоПодвыражений=SubMatches.Count();
            Для н = 0 По ЧислоПодвыражений-1 Цикл
                SubMatch=SubMatches.Item(н);
                Если SubMatch="" Тогда
                    Продолжить;
                КонецЕсли;    
                
                Сообщить("Подстрока: "+SubMatch);
            КонецЦикла;    
        КонецЦикла;
    Иначе
        Сообщить("Вхождений шаблона не найдено");
    КонецЕсли;
КонецПроцедуры

//Выводит в окно сообщений:
//Подстрока:   
//Подстрока: <tr>
//Подстрока: <td id=aaa>
//Подстрока: Дятел 
//Подстрока: <td>
//Подстрока:  долбит 
//Подстрока: <td>
//Подстрока:  сосну 
//Подстрока: </tr>

Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Код 1C v 7.x
 ///////////////////////////////////////////////////////////////////////
//Проверка подстроки
Процедура RegExp_Test()
    RegExp = CreateObject("VBScript.RegExp");
    RegExp.Pattern =  "^\d+$"; //Шаблон, который соответствует целому числу
    стр="12345";//Строка, которую тестируем
    Если RegExp.Test(стр)=0 Тогда
        Сообщить("Это не целое число");
    Иначе
        Сообщить("Это целое число");
    КонецЕсли;
    //Выдаст в окно сообщений:    
    //"Это целое число"
КонецПроцедуры

Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Код 1C v 7.x
 ///////////////////////////////////////////////////////////////////////
//Замена текста в подстроке
Процедура RegExp_Replace()
    
    //Строка, где мы будем производить замены
    стр="Дятел долбил сосну";
    
    Истина=-1;
    Ложь=0;
    RegExp = CreateObject("VBScript.RegExp");
    
    RegExp.IgnoreCase = Истина; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Истина; //Многострочный режим
    
    
    RegExp.Pattern = "(долбил)"; 
    
    стр=RegExp.Replace(стр, "про$1"); 
    Сообщить(стр);
    //Выдаст в окно сообщений:    
    //"Дятел продолбил сосну"
КонецПроцедуры

Источник
Разместил:   Версии: | 7.x | 8.x | 8.2 УП |  Дата:   Прочитано: 36745
 +1 
Распечатать
Возможно, вас также заинтересует
Выбор оптимального алгоритма для разбора строки в массив 0
Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных 100 000 строк. Как сделать бытсрее? // Пример Defender aka LINN ВремяНачала = ТекущаяДата(); Сообщить(" Обработка начата: " + ВремяНачала); ТЗ = Новый Та
Как мы писали парсер сайта с ценами для 1С 1
Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и процентным отклонением от цен основ
Как напечатать документ на определенном принтере из сеанса RDP (Терминал) 5
В 1С есть возможность обратиться к принтеру по имени перед печатью, однако при работе через терминал к названию принтера добавляется (перенаправлено N), где N постоянно меняется. Решение следующее: НаКлиенте Функция ИмяПринтераRDP(ИмяПринтера) S
Как проверить наличие русских букв в строке? 0
//рег=СоздатьОбъект(" VBScript.RegExp" ); // Для 7.7 Рег = Новый COMОбъект(" VBScript.RegExp" ); Рег.global=-1; Рег.ignorecase=-1; Рег.pattern=" " ; Сообщить(Рег.test(" есть русские bukovy" )); Сообщить(Рег.test(" netu russ bukov" ));
Как сформировать документ в Word из 1С? (Active Document) 15
ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ _ Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа: 1. Путем замены шаблонного текста в макете Wordа. 2. Путем вставки текста с помощью закладок в Wo
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!