Регулярные выражения — это удобнейшая вещь для решения многих задач по анализу какого-либо текста. К сожалению встроенный язык не предоставляет «родных» инструментов для работы с регулярными выражениями.
Но не все так плохо — никто не мешает использовать встроенный в Windows (в Windows 98 и выше) объект — VBScript.RegExp.
Весь приведенный ниже код работает как в версии 7.7 так и версиях 8.x.
Единственным отличием 7.7 от 8.x является строка создания объекта.
7.7.:
1 | RegExp = CreateObject("VBScript.RegExp"); |
8.x:
1 | RegExp = Новый COMОбъект("VBScript.RegExp"); |
Кроме этого, для полного сходства кода в разных версиях, в коде версии 7.7 полезно определить вот такие переменные:
1 2 | Истина = -1; Ложь = 0; |
Хотя во многих конфигурациях эти переменные определены как глобальные.
Ниже описаны свойства и методы объекта VBScript.RegExp.
Свойства:
- Global. Ложь — искать до первого нахождения, Истина — искать во всем тексте. Значение по умолчанию — Ложь;
- IgnorCase. Ложь — учитывать регистр символов, Истина — не учитывать регистр символов. Значение по умолчанию — Ложь;
- Multiline. Ложь — однострочный объект, Истина — многострочный объект. Это свойство влияет на работу метасимволов ^ и $. Значение по умолчанию — Ложь;
- Pattern. Строка используемая как шаблон регулярного выражения. Чаще всего, говоря о регулярном выражении, люди имеют ввиду именно шаблон. О том, как составлять шаблоны можно узнать, например, тут.
Методы:
- Test(СтрокаТекста). Метод проверяет переданную в параметре строку на соответствие шаблону (например проверка корректности адреса эл. почты). Возвращаемые значение: Ложь — строка соответствует шаблону, Истина — строка не соответствует шаблону;
- Replace(СтрокаТекста, СтрокаЗамены). Ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены). Возвращаемые значения: измененный (возможно) параметр СтрокаТекста;
- Execute(СтрокаТекста). Ищет соответствующие шаблону вхождения в параметре СтрокаТекста. Возвращаемые значения: коллекция найденных подстрок.
Для составления, тестирования и отладки шаблонов регулярных выражений существует огромное количество специализированного софта, например, RegexBuddy. Кроме этого, простенький отладчик регулярных выражений для 1С был рассмотрен в недавнем обзоре материалов сайта infostart.ru.
Следующий пример ищет HTML теги в строке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Процедура RegExpExecute() RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.IgnoreCase = Ложь; RegExp.Global = Истина; RegExp.MultiLine = Ложь; RegExp.Pattern = "<[^>]*>"; Matches=RegExp.Execute("Тестовая строка с HTML тегами"); Для С = 0 По Matches.Count()-1 Цикл Match = Matches.Item(С); Сообщить(Match.Value); КонецЦикла; КонецПроцедуры |
Использование в шаблоне круглых скобок (группировки) задействует коллекции SubMatces. Изменим шаблон в предыдущем примере таки образом:
1 | RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; |
Будут найдены не только теги, но и текст до и после тега. Для обработки такого шаблона, код будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Процедура RegExpExecute() RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.IgnoreCase = Ложь; RegExp.Global = Истина; RegExp.MultiLine = Ложь; RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; Matches=RegExp.Execute("Тестовая строка с HTML тегами"); Для С = 0 По Matches.Count()-1 Цикл Match = Matches.Item(С); SubMatches = Match.SubMatches; Для к = 0 По SubMatches.Count()-1 Цикл SubMatch=SubMatches.Item(к); Сообщить(SubMatch); КонецЦикла; КонецЦикла; КонецПроцедуры |
Еще пример — простая функция для проверки корректности адреса электронной почты:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Функция ПроверитьEmail(Емеил) Экспорт RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.MultiLine = Ложь; RegExp.Global = Истина; RegExp.IgnoreCase = Истина; RegExp.Pattern = ".+@.+\..+"; Если RegExp.Test(Емеил) Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции |
Если регулярные выражения используются часто, то будет разумно написать некую оболочку. Основные позиции таковы:
- Глобальная переменная, являющаяся объектом VBScript.RegExp;
- Инициализация глобальной переменной при запуске конфигурации или функция инициализации вызываемая по необходимости;
- Инкапсуляция методов объекта VBScript.RegExp.
На этом все, надеюсь данный материал Вам помог.
Загрузка...
Функцию инициализации достаточно вставить в общий модуль с повторным использованием возвращаемых значений и тогда не потребуется глобальных переменных.
Вот пример из разрабатываемой сейчас конфы, где я активно использую регулярки.
Функция RegExp(Знач ШаблонВыражения = «») Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация();
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ИмяМакета = «ОбщийМакет.enRex32»;
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ИмяМакета = «ОбщийМакет.enRex64»;
КонецЕсли;
Попытка
КодВозврата = ПодключитьВнешнююКомпоненту(
ИмяМакета,
«RegEx»,
ТипВнешнейКомпоненты.Native);
Исключение
Возврат Ложь;
КонецПопытки;
Если Не КодВозврата Тогда
Возврат Ложь;
КонецЕсли;
Возврат Новый(«V8RegEx», ШаблонВыражения);
КонецФункции
слово «И» нельзя использовать как итератор цикла — это зарезервированное слово
Я делал через схему xdto, без внешних компонентов. Могу показать, как.