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