HelpF.pro

Использование регулярных выражений (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");
Сообщить(стр);
//Выдаст в окно сообщений:
//"Дятел продолбил сосну"
КонецПроцедуры

Источник
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq8/view/985.html