Данный материал касается платформы 8.х
О функциях и формате шаблона RegExp подробно можно почитать здесь:
http://ru.wikipedia.org/wiki/Регулярные_выражения
http://www.script-coding.info/WSH/RegExp.html
Книга Михайлов А. Системное программирование в 1С: Предприятии 7.7/8.0 (Глава 1. "Применение технологий СОМ и ActiveX" - "Регулярные выражения")
библиотека RegExp является предустановленной т.е. есть в любом Windows
Возможности регулярных выражений:
Сравнить текст с заданным шаблоном (метод Test).
Заменить или удалить из строки текст, соответствующий заданному шаблону (метод Replace).
Извлечь из строки текст, соответствующий заданному шаблону (метод Execute).
1. Использование
RegExp используется в 1С через COM интерфейс пример кода:
RegExp = Новый COMОбъект("VBScript.RegExp");// создаем объект для работы с регулярными выражениями
RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
Шаблон = ".+@.+\..+"; //шаблон проверки e-mail
RegExp.Pattern = Шаблон; // шаблон (регулярное выражение)
ПроверяемыйEMail = "test@mail.ru";
Если Не RegExp.Test(ПроверяемыйEMail) Тогда
Сообщить("Некорректный email");
КонецЕсли;
о методах и свойствах можно почитать подробно здесь
2. Достоинства RegExp
Плюсы:
- хорошая скорость анализа т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
- высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки - разбору)
- доп. функционал (можно осуществлять анализ, замену и проверку строковых выражений)
Минусы:
- не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом
- Возможны зависания при использовании сложных шаблонов. Отладчик RegExBuddy в таких ситуациях пишет о невозможности получить результат за разумное число итераций
- RegExp доп. библиотека (инициализация занимает значительное время)
основное достоинство RegExp это читаемость
3. Отладка и проверка (RegExBuddy)
Отладка регулярных выражений довольно частая задача т.к. бывает трудно понять и сам шаблон и ошибки в разборе. Наиболее удобным инструментом на мой взгляд является программа RegexBuddy (внешний вид программы есть в скриншотах) она осуществляет подцветку разбираемых выражений и многое другое, есть все что нужно и даже больше. Очень простой в использовании инструмент.
Также есть тестер 8.1 от coder1cv8, но в нем к сожалению нет подвыражений и запускается только из 1С8.
4. "Обертки"
При частом использовании RegExp приходится делать более удобные и читаемые "оберки" (+ русифицированные) Внимание! Данные функции более медленные
Код функций:
Перем RegExp;
//RegExp --------------------------------------------------------
Процедура РегулярныеВыражения_Инициализация (Шаблон, ИскатьДоПервогоСовпадения = Истина, МногоСтрок = Истина, ИгнорироватьРегистр = Истина) Экспорт
Если RegExp = Неопределено Тогда //Нужна инициализация
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями
КонецЕсли;
//Заполняем данные
RegExp.MultiLine = МногоСтрок; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Не ИскатьДоПервогоСовпадения; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = ИгнорироватьРегистр; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон; // шаблон (регулярное выражение)
КонецПроцедуры
Функция РегулярныеВыражения_Проверка(ПроверяемыйТекст)
Возврат RegExp.Test(ПроверяемыйТекст);
КонецФункции
Функция РегулярныеВыражения_Выполнить(АнализируемыйТекст) Экспорт
РезультатАнализаСтроки = RegExp.Execute(АнализируемыйТекст);
МассивВыражений = Новый Массив;
Для Каждого Выражение Из РезультатАнализаСтроки Цикл
СтруктураВыражение = Новый Структура ("Начало, Длина, Значение, ПодВыражения", Выражение.FirstIndex, Выражение.Length,Выражение.Value);
//Обработка подвыражений
МассивПодВыражений = Новый Массив;
Для Каждого ПодВыражение Из Выражение.SubMatches Цикл
МассивПодВыражений.Добавить(ПодВыражение);
КонецЦикла;
СтруктураВыражение.ПодВыражения = МассивПодВыражений;
МассивВыражений.Добавить (СтруктураВыражение);
КонецЦикла;
Возврат МассивВыражений;
КонецФункции
//RegExp --------------------------------------------------------
Использование на примере с email:
РегулярныеВыражения_Инициализация (".+@.+\..+");
ПроверяемыйEMail = "test@mail.ru";
Если Не РегулярныеВыражения_Проверка(ПроверяемыйEMail) Тогда
Сообщить("Некорректный email");
КонецЕсли;
5. Примеры использования (полезные универсальные функции)
Функция ПодставитьПараметрыВСтроку (СтрокаШаблон, Коллекция) - подставляет в строку параметры из коллекции
СтрокаШаблон - строка вида "Текст [Параметр]" параметры должны быть заключены в квадратные скобки
Коллекция - коллекция из которой будут подбираться одноименные параметры
Пример: ПодставитьПараметрыВСтроку ("Выполнено: [ВыполненоПроцент]%", Новый Структура ("ВыполненоПроцент",50));
Результатом выполнения будет строка : "Выполнено: 50%"
Функция РазложитьСтрокуВМассив (Строка, Разделитель = ",") - возвращает массив полученный из строки элементами которого являются строки разделенные разделителем (эта функция есть практически в любой конфигурации от 1С)
Строка - строка из которой берем данные
Разделитель - символ разделитель (по умолчанию ",")
Пример: РазложитьСтрокуВМассив("1,23,45");
Результатом выполнения будет массив строк : "1","23","45"
Код функций:
Функция ПодставитьПараметрыВСтроку (Шаблон, КоллекцияЗаполнения) Экспорт
РегулярныеВыражения_Инициализация ("\[([\d\wЁА-Я]+)\]", Ложь);
НайденныеПараметры = РегулярныеВыражения_Выполнить(Шаблон);
НовыйТекст = Шаблон;
Для Каждого Параметр Из НайденныеПараметры Цикл
//Получим имя параметра
ИмяПараметра = Параметр.ПодВыражения[0];//Первый элемент
Попытка //Параметр может отсутствовать в коллекции
//Получим значение параметра
ЗначениеПараметра = КоллекцияЗаполнения[ИмяПараметра];
//Подстановка параметров
НовыйТекст = СтрЗаменить(НовыйТекст, Параметр.Значение, ЗначениеПараметра);
Исключение
КонецПопытки;
КонецЦикла;
Возврат НовыйТекст;
КонецФункции
Функция РазложитьСтрокуВМассив(Строка, Разделитель = ",") Экспорт
//Разбор строки вида 1,СЛОВО,(1+2); Маска для разделителя ',' ([^\,]+),?"
РегулярныеВыражения_Инициализация ("[^\" + Разделитель + "]+", Ложь, Ложь, Ложь);
Выражения = РегулярныеВыражения_Выполнить(Строка);
Массив = Новый Массив;
Для Каждого Выражение Из Выражения Цикл
Массив.Добавить(Выражение.Value);
КонецЦикла;
Возврат Массив;
КонецФункции
Можно было привести более сложные примеры, но они бы имели узкую направленность.
6. Заключение
RegExp имеет хорошую скорость обработки и отличную читаемость .
На регулярах построены многие интересные разработки на инфостарте:
[2 in 1] «Обфускация кода 1С» и «RegExp Тестер» от coder1c8
т.е. везде где нужна низкоуровневая обработка текста (разбор различных текстовых данных) хороший выбор это регуляры.
в файлах есть пример кода на RegExp и сравнение скорости