Поиск по блогу

пятница, 13 февраля 2015 г.

Использование регулярных выражений в 1С. Да-да, это возможно!

  Регулярное выражение - это шаблон текста, который состоит из обычных символов и/или специальных метасимволов.

Поиск необходимого COM-объекта

  Потребовалось мне выбрать из строки слова, заключенные в квадратные скобки. Например, имеется строка: "Строка с [Квадратными] скобками для [примера]", результат должен быть: "Квадратными" и "примера". Так как у платформы 1С нету стандартной функции по выполнению регулярного выражения, то сразу же полез на просторы MSDN. Там я нашел класс System.Text.RegularExpressions.Regex, но создать COM-объект этого класса у меня не получилось :(, думаю, может как-то по-другому создается COM-объект для этого класса и полез в Редактор реестра:
VBScript.RegExp в редакторе реестра
  Там я обнаружил в ветке HKEY_CLASSES_ROOT имя COM-объекта VBScript.RegExp. Этот объект работает на основе библиотеки vbscript.dll и именуется технологией VBScript Regular Expressions.

Описание COM-объекта VBScript.RegExp

Свойства:

  • Global: Ложь - проверять до первого соответствия, Истина - проверять по всему тексту. По умолчанию - Ложь.
  • IgnoreCaseЛожь - учитывать регистр символов, Истина - игнорировать регистр символов. По умолчанию - Ложь.
  • Pattern: строка, используемая как шаблон.
  • MultilineЛожь - однострочный объект, Истина - многострочный. По умолчанию - Ложь. Влияет на работу метасимволов ^ и $.

Методы:

  • Replace: замена соответствующих шаблону вхождений в строке-оригинале на указанную подстроку, возвращает изменённую строку.
  • Test: проверка соответствия шаблону, возвращаемое значение - булево.
  • Execute: поиск соответствующих шаблону вхождений в исходной строке, возвращает набор найденных подстрок.

Заставляем работать VBScript.RegEx в 1С

  Для этого мне потребовалось написать небольшую функцию в общем модуле у которого свойство Вызов сервера = Истина. Тем самым эту функцию мы можем вызывать в любом контексте!

// Функция возвращает результат выполнения регулярного выражения.
//
// Параметры:
// Строка - Строка - исходня строка;
// Метод - Строка - совершаемое действие: replace, test, execute;
// Шаблон - Строка - регулярное выражение;
// Замена - Строка - используется для действия replace.
//
// Возвращаемое значение:
//  Булево, Строка, Массив - результат выполнения регулярного выражения.
//
Функция ВыполнитьРегулярноеВыражение(Строка, Метод, Шаблон, Замена = "") Экспорт

RegularExpressions = Новый COMОбъект("VBScript.RegExp");
RegularExpressions.Global = Истина; // Ложь - проверять до первого соответствия, Истина - проверять по всему тексту.
RegularExpressions.IgnoreCase = Ложь; // Ложь - учитывать регистр символов, Истина - игнорировать регистр символов.
RegularExpressions.Pattern = Шаблон; // Строка, используемая как шаблон.
RegularExpressions.MultiLine = ?(СтрЧислоСтрок(Строка) > 1, Истина, Ложь); // Ложь - однострочный объект, Истина - многострочный.

РезультатВыполнения = Неопределено;
Если Метод = "replace" Тогда // Замена соответствующих шаблону вхождений в строке-оригинале на указанную подстроку.
РезультатВыполнения = RegularExpressions.Replace(Строка, Замена);
ИначеЕсли Метод = "test" Тогда // Проверка соответствия шаблону.
РезультатВыполнения = RegularExpressions.Test(Строка);
ИначеЕсли Метод = "execute" Тогда // Поиск соответствующих шаблону вхождений в строке-оригинале.
РезультатВыполнения = RegularExpressions.Execute(Строка);
КоллекцияДанных = Новый Массив;
Для Каждого Элемент Из РезультатВыполнения Цикл
КоллекцияДанных.Добавить(Новый Структура("Значение, ИндексПервогоСимовла", Элемент.Value, Элемент.FirstIndex));
КонецЦикла;
РезультатВыполнения = КоллекцияДанных;
КонецЕсли;

Возврат РезультатВыполнения;

КонецФункции // ВыполнитьРегулярноеВыражение()


  Думаю, описывать функцию нет смысла, по комментариям должно быть понятно. Вызов функции для моей задачи выглядит следующим образом:

Коллекция = ВыполнитьРегулярноеВыражение("Строка с [Квадратными] скобками для [примера]", "execute", "\[[0-9а-яА-Яa-zA-Z]+\]");

Комментариев нет:

Отправить комментарий