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

Материал из КинтВики
Перейти к: навигация, поиск


Источник: http://www.kb.mista.ru/article.php?id=698

Автор статьи: romix

Последняя редакция №8 от 02.09.08

Ключевые слова: RegExp, Регулярные выражения

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

Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.


Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:

<source lang=1c> RegExp = Новый COMОбъект("VBScript.RegExp"); </source>

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

Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.

<source lang=1c> /////////////////////////////////////////////////////////////////////// //Поиск вхождений подстроки Процедура RegExp_Exec()

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

КонецПроцедуры </source>


Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.

<source lang=1c> /////////////////////////////////////////////////////////////////////// //Поиск вхождений подстроки с использованием подвыражений Процедура 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> </source>

Часто регулярные выражения используются для тестирования строк, например пользовательского ввода. Этот пример позволяет узнать, является ли строка целым числом.

<source lang=1c> /////////////////////////////////////////////////////////////////////// //Проверка подстроки Процедура RegExp_Test()

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

КонецПроцедуры </source>

Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д. (знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).

<source lang=1c> /////////////////////////////////////////////////////////////////////// //Замена текста в подстроке Процедура RegExp_Replace()

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

КонецПроцедуры </source>

Ссылки

Александр Шабля "Использование VBScript RegExp в Delphi" http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1062

Здесь вы найдете примеры использования регулярных выражений http://regexp.by.ru/

Notepad++ - удобный текстовый редактор, который поддерживает поиск и замену с использованием регулярных выражений. http://notepad-plus.sourceforge.net/ru/site.htm