При проверке корректности ввода реквизитов (номеров документов, кабинетов, кодов) часто возникает задача проверить, начинается ли строка с определенного набора символов и содержит ли она после этого произвольные цифры или буквы. Разберем, как устроен этот механизм при работе через COM-объект VBScript.RegExp, проанализируем частые ошибки при составлении масок и рассмотрим современные встроенные возможности платформы 1С.
Рассмотрим распространенное заблуждение: при переходе из подсистем поиска файлов или масок командной строки многие считают символ * универсальным "джокером", означающим "любые символы". Однако в регулярных выражениях синтаксис работает иначе.
Посмотрим на пример кода проверки через COM-объект VBScript.RegExp:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "114*";
Результат = RegExp.Test(ЗначениеРеквизита);
При попытке применить шаблон 114* метод Test будет возвращать значение Истина практически для любой строки. Выясним причину такого поведения:
* применяется к предыдущему символу и означает "ноль или более повторений данного символа". Шаблон 114* расшифровывается как: одна единица, за ней еще одна единица, а затем ноль или более четверок.VBScript.RegExp метод Test ищет вхождение подстроки в любом месте текста. Так как выражение 114* успешно совпадает с подстрокой "11" (ноль четверок), метод возвращает положительный результат почти на любой строке, содержащей хотя бы две единицы подряд.Разберем, из каких элементов должен состоять корректный шаблон регулярного выражения для проверки формата строки.
^): Если не привязать шаблон к началу строки, поиск совпадения может произойти в середине текста (например, в строке "01144"). Чтобы проверка работала строго с первого символа, используется символ якоря ^..): В регулярных выражениях именно точка означает "любой одиночный символ"..*: Сочетание точки и звездочки означает "любое количество (от 0 до бесконечности) любых символов".Проанализируем правильный вариант шаблона для проверки строки, которая должна строго начинаться с "114":
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^114.*";
Если RegExp.Test(ЗначениеРеквизита) Тогда
// Значение реквизита корректно
КонецЕсли;
Разберем еще один частый пример: необходимо проверить, что строка начинается с трех произвольных символов, а на четвертом месте стоит цифра 4. Для этого сформируем шаблон следующего вида:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^...4";
// С трех любых символов в начале строки, за которыми идет цифра 4
РезультатПроверки = RegExp.Test(ЗначениеРеквизита);
Начиная с версии платформы 8.3.23, в 1С:Предприятие появилась встроенная кроссплатформенная поддержка регулярных выражений. Это позволяет отказаться от использования Windows-зависимого COM-объекта VBScript.RegExp и выполнять проверки как на сервере под управлением Linux, так и в тонком или веб-клиенте.
Посмотрим, как выглядит аналог проверки с использованием функции СтрПодобнаПоРегулярномуВыражению:
Шаблон = "^114.*";
Если СтрПодобнаПоРегулярномуВыражению(ЗначениеРеквизита, Шаблон) Тогда
// Значение соответствует маске
КонецЕсли;
В платформу также входят дополнительные функции для работы с регулярными выражениями:
СтрНайтиПоРегулярномуВыражению — поиск вхождения подстроки по заданному шаблону с возвратом информации о позиции и длине;СтрНайтиВсеПоРегулярномуВыражению — получение массива всех совпадений в строке;СтрЗаменитьПоРегулярномуВыражению — замена подстрок, соответствующих регулярному выражению.Использование встроенных функций платформы повышает производительность, обеспечивая кроссплатформенность и стабильность работы кода в любых операционных системах.