При работе с текстовыми данными в 1С часто возникает задача извлечения идентификаторов или номеров, имеющих строгий формат. Например, поиск шестизначного числа, которое должно быть корректно отделено от других символов. Рассмотрим, как решить эту задачу, избегая захвата лишних данных или некорректных последовательностей.
Задача заключается в том, чтобы найти шесть цифр подряд, но при этом игнорировать ситуации, когда эти цифры являются частью более длинной последовательности (например, 12 цифр подряд) или когда они следуют сразу за определенными символами, такими как дефис. Использование простого шаблона \d{6} приводит к тому, что система «видит» все подходящие фрагменты, даже если они нам не нужны.
Для фильтрации результатов мы будем использовать так называемые «проверки» или ассерции. Они позволяют задать условия для символов, которые предшествуют или следуют за искомым шаблоном, не включая их в результат поиска. Рассмотрим несколько вариантов, предложенных в ходе обсуждения.
Чтобы гарантировать, что перед искомым номером не стоит дефис или другая цифра, мы можем использовать конструкцию, которая проверяет «состояние» слева от наших цифр. Шаблон выглядит следующим образом:
(?<=[^\d-])\d{6}(?=\D)
Разберем, что именно делает этот шаблон:
(?<=[^\d-]) — это проверка, которая смотрит назад. Она говорит системе: «убедись, что перед цифрами нет ни цифры, ни дефиса».\d{6} — непосредственно сам шаблон, который ищет шесть цифр подряд.(?=\D) — это проверка, которая смотрит вперед. Она гарантирует, что сразу после шести цифр идет символ, не являющийся цифрой. Это помогает отсеять длинные последовательности цифр.Важно помнить, что движок регулярных выражений, который использует платформа 1С (обычно это системный компонент VBScript.RegExp), имеет свои особенности и ограничения. Если ваш шаблон не срабатывает, попробуйте следующие стратегии:
Global объекта RegExp в значение Ложь (False). В этом случае движок вернет только первое совпадение и завершит работу, что избавит от необходимости усложнять регулярку для отсечения последующих цифр.\d{6}, а затем программно переберите полученную коллекцию совпадений в коде 1С, удаляя те, которые не соответствуют вашим бизнес-правилам (например, следуют сразу после дефиса).При написании кода всегда учитывайте версию платформы и операционную систему. Поддержка конструкций вроде (?<=) может отсутствовать в старых версиях движка RegExp. Если вы столкнулись с ошибкой при выполнении, попробуйте упростить выражение до поиска \d{6} и реализовать проверку условий («что стоит до/после») уже внутри цикла обработки результатов методами работы со строками, такими как Лев(), Прав() или Найти().
Для отладки всегда рекомендуем использовать специализированные веб-сервисы, которые визуализируют работу регулярного выражения. Это позволяет быстро проверить, как ведет себя шаблон на различных тестовых примерах, и сэкономить время при разработке функционала в конфигураторе.