1с проверить текст на соответствие шаблону
Строка — это один из примитивных типов данных существующих 1С и работать с ним приходится практически постоянно. Следовательно необходимо иметь представление о том, какие функции для работы со строками существуют, как и когда они используются, а также, что получается в результате. Этим и займемся.
Функции для работы со строками в 1С 8.2 и 8.3
Строка
Функция Строка(x) возвращает текстовое представление переданного ей значения “x”.
СтрДлина
Функция СтрДлина(x) вычисляет количество символов в строке “x”, учитывая пробелы и ничего не значащие символы.
СокрЛП, СокрЛ, СокрП
Функции СокрЛП(x), СокрЛ(x) и СокрП(x) убирают пробелы и ничего не значащие символы у переданной строки “x” с обеих сторон, слева и справа соответственно.
Лев, Прав, Сред
Функции Лев(x, y) и Прав(x, y) возвращают количество символов “y” с левого или правого края переданной им строки “x”. А функция Сред(x, y, z) возвращает количество символов “z” из указанного места “y” переданной строки “x”.
ВРег, НРег, ТРег
Функция ВРег(x) преобразует все символы переданной строки “x” в верхний регистр, НРег(x) — в нижний регистр, ТРег(x) — первую букву каждого слова преобразует в верхний регистр, а все остальные нижний.
Найти
Функция Найти(x, y) возвращает номер первого символа первого вхождения подстроки “y” в строку “x”, если, конечно, такое вхождение найдено (при этом нумерация начинается с 1). Если же вхождений не найдено, то функция возвращает 0.
СтрЧислоВхождений
Функция СтрЧислоВхождений(x, y) возвращает количество вхождений подстроки “y” в строку “x”.
СтрЗаменить
Функция СтрЗаменить(x, y, z) позволяет в указанной строке “x” заменить все вхождения одной подстроки “y” на другую “z”, результатом выполнения функции будет строка с проведенными заменами.
ПустаяСтрока
Функция ПустаяСтрока(x) сравнивает переданную ей строку “x” с пустой и возвращает результат этого сравнения — Истина или Ложь, при этом строка состоящая из пробелов и/или ничего не значащих символов приравнивается к пустой.
СтрЧислоСтрок
Функция СтрЧислоСтрок(x) возвращает количество строк в многострочном тексте “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4
СтрПолучитьСтроку
Функция СтрПолучитьСтроку(x, y) возвращает строку с номером “y” из многострочного текста “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4
Символ, КодСимвола
Функция Символ(x) получает код символа “x” и возвращает строку содержащую соответствующий символ (в кодировке Unicode). Функция КодСимвола(x) делает обратное действие — получает символ “x” и возвращает его код в кодировке Unicode. Таблицу символов Unicode можно найти, например, тут.
Символы
Это не функция, а набор наиболее часто используемых специальных символов, состоит из:
- ВК (CR) — возврат каретки;
- ВТаб (VTab) — вертикальная табуляция;
- НПП (NBSp) — неразрывный пробел;
- ПС (LF) — перевод строки;
- ПФ (FF) — перевод формы;
- Таб (Tab) — символ горизонтальной табуляции.
ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр
Функция ЗначениеВСтрокуВнутр(x) возвращает системное строковое представление значения “x”. Функция ЗначениеИзСтрокиВнутр(x) проделывает обратную операцию и возвращает значение, полученное из строкового системного представления “x”. Обе эти функции используются для сохранения функциональной совместимости с версией 7.7. Использование для каких-либо других целей не рекомендуется. В новых версиях платформы данные функции не работают (хотя их описание присутствует в справке).
ВвестиСтроку
Функция ВвестиСтроку(x, y, z, w) вызывает диалог для ввода строки, введенная строка записывается в переменную “x”, кроме этого можно указать подсказку “y”, длину вводимой строки “z”, отметку многострочности вводимого текста “w”. Функция возвращает Истина — если ввод был произведен, Ложь — если пользователь отказался от ввода. Выглядит это окно примерно так:
На момент написания статьи на Инфостарте предлагали 2 способа проверки строки на соответствие шаблону. Первый с использованием внешних компонент, второй с использованием фабрики XDTO (голый парсинг текста не считаем). Предлагаю третий - с использованием языка запросов.
Откровенно говоря, этот способ работает дольше и предлагает меньшее богатство инструментов для создания шаблона, но тем не менее кому-то может показаться интересным, кроме того, не помешает знать о нем для общего развития. Пишем запрос:
Устанавливаем значения параметров и выполняем. В результате всегда будет 1 строка, содержащая в реквизите ЕстьСоответствие булево значение.
Для описания шаблона можно использовать следующие выражения:
- %: любое количество произвольных символов
- _: один произвольный символ
- []: любой одиночный символ из перечисленных внутри квадратных скобок.
- [^]: любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
- \: экранирование управляющих символов
- "%АБВ%" - строка, в которой встречается последовательность "АБВ"
- "%[А-Я1-5]%" - строка, в которой встречается любая киррилическая буква в верхнем регистре или цифра от 1 до 5
- "%[АВБ]%" - строка, в которой встречается буква А, Б или В
- "%[^К-Н]%" - строка, в которой не встречаются символы К, Л, М, Н.
- "15 ЯНВАР[ЬЯ] 2077" - дата в январе 21-го века )
Далее, можно писать множественные сравнения, собирать текст запроса из многих условий и вообще использовать как фантазия подскажет. Удачи!
Специальные предложения
Дык. В упр. формах - это только с переходом на сервер можно сделать. Да еще и будет обращение в БД.
Так-то да, запросное подобие по-проще регулярок. Но накладные расходы, мне кажется, будут слишком велики.
(1) ну понятно, что это не клиентский вариант )
на самом деле я использую этот вариант потому, что он (как не странно) дает выигрыш в производительности в специфических условиях: у меня множество строк (~1000) и множество шаблонов (~100) по которым их надо проверить. и запрос позволяет проверить такое "одним махом", другие варианты - только циклом.
(2) Т.е., динамически генеришь огромный запрос? Хм. Тоже надо подумать в эту сторону.
Как раз занимаюсь разбором данных (экселей). Замаялся и уже в сторону НС начал думать;)
(5) да, с манипуляциями беда, но у меня ощущение, что когда «все» говорят про регулярные выражения - имеют ввиду прежде всего поиск по шаблону, а с этим все ок
(7) ну выделите с помощью выражений шаблона запроса 1с, например, число с разделителем из строки, эдакий аналог 8\d*(((,|\.)\d)|(( )\d))*
1.23, 1 000.00, 1 000 000.23 и т.п. (реально используемый пример для парсинга инвойсов из пдф)
(9) вы пытаетесь сказать, что инструментарий ненастолько богат, как, скажем в случае использования xdto?
Штука конечно интересная, но на более менее большой таблице по производительности полный швах.
Единственное что быстро работает это конструкция ТЕКСТ% на строках ограниченной длинны попадающих в индекс по плану запроса, все остальное от лукавого.
Если такая задача становится - решать ее желательно другими методами.
Скажем так на жалких 100 000 позициях номенклатуры решение этой задачи через полнотекстовый поиск более чем на порядок быстрее, но там есть ньюансы.
А есть области где номенклатурные позиции измеряются миллионами (практически любое направление связанное с ремонтом, для каждой модели свой номенклатурный каталог)
Но если задача стоит в разборе таблицы, находящейся в памяти, как описано здесь в комментариях, то решение вполне себе приемлимо, но встает вопрос, а не проще напрямую через ADO подключится к екселю и выполнить запрос на его стороне, по своему опыту - 250 000 строк екселя запросом с отбрами и группировками выполнились за единицы секунд.
Дабы не затягивать, сразу приведу код. Кто хочет разобраться, в чем тут, собственно, дело, пусть читает статьи по XDTO. О регулярных выражениях расскажу ниже, но статей на эту тему и так масса.
Для тех, кому мало.
Итак, лет этак эндцать назад программисты решили упростить поиск, замену и проверку на соответвие различных строк, т.к. им, полагаю, надоело каждый раз писать что-то типа:
В итоге во всех нормальных языках программирования были реализованы библиотеки, содержащие процедуры и функции для работы с регулярными выражениями, и жизнь разработчиков качественно улучшилась, ибо тот монструозный код можно было заменить на куда более простой:
Да, грамотным разработчикам стало ой как просто. Но что делать остальным? Правилный ответ, конечно, - учиться, учиться и еще раз учиться! )))
Итак, самое простое, что нужно, чтобы освоить шаблоны проверки:
+ - один или более раз , пример ".+" - один или более любой символ.
* - ноль или более раз , пример ".*" - любое количество любых символов (даже ни одного).
[n-m] - символ от m до n, пример: "4+" - одна или более цифр(а).
\d - цифра, пример \d+ - одна или более цифр(а).
\s - пробельный символ - ТАБ, пробел, перенос строки, возврат каретки и т.п.
\S - непробельный символ.
\w - буква, цифра, подчеркивание.
\W - не буква, не цифра и не подчеркивание соответственно.
^ - начало текста, например "^\d+" - строка начинается с цифры.
$ - конец текста, например "\D+$" - строка заканчивается НЕ цифрой.
- шаблон для от m до n символов, например "\d" - от двух до четырех цифр. Можно указать одну и всего цифру для строгого соответвия.
\ - экранирует спецсимволы. Например, "\." - символ точки.
Специальные предложения
(1) neuromancer_aza, у меня Linux, поэтому мне непросто ответить на Ваш вопрос, но Вы всегда можете померять это самостоятельно и рассказать нам. Предположу, что медленнее, если не кешировать объект XDTO, но если кешировать, то может быть и быстрее (если надо один шаблон тестить с многими исходными данными)
При использовании данным способом шаблона:
: Ошибка при вызове метода контекста (ПрочитатьXML)
Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
по причине:
Ошибка разбора XML: - [4,38]
Фатальная ошибка:
xmlParseEntityRef: no name
Не подскажете как быть в данной ситуации? Подозреваю что причина может быть в символе "&"
(63) 1C, на сколько я помню, не умеет "$" и "^", т.к. для проверки шаблона эти символы не нужны. Попробуйте убрать их из строки.
По поводу "&" - то это символ? На сколько я знаю (и вики - тоже) - амперсанд - это обычный символ, на него ничто ругаться не должно.
ЗЫ: также, возможно Вы зря заэкранировали "!". Т.е. не нужно писать "\!" - нужно просто "!".
Да спасибо.
Действительно, убрал "$" и "^" а вместо "&" использовал '& amp;' и теперь работает.
(2) Sergey Andreev , а что Вы понимаете под "кэшированием объекта"? Как это правильно реализовать, можно примерчик? Мне как раз нужно проверять много строк на соответствие одному шаблону.
Заранее спасибо!
(68) просто добавьте в функцию параметр "test", а в коде функции строки с созданием объекта оберните в блок Если-Тогда-КонецЕсли, в котором проверяйте условие "test = неопределено". Перед первым вызовом напишите "test = Неопределено" (перед циклом проверки). В итоге у Вас функция будет вызываться только первый раз с пустым объектом XDTO, а в следующий раз уже с заполненным, что приведет к использованию уже созданного объекта, а не созданию нового.
Прекрасно!
От себя могу только добавить, что есть еще объекты для работы с XPath, это тоже регулярные выражения, но для уже языков разметки, типа html и xml.
Если добавите и их, будет совсем хорошо!
Роман Цованян.
(4) Поручик, предположу, что если сохранять объект XDTO, то и в цикле будет быстро. Если же каждый раз фабрикой создавать пакет, то. полагаю, при множественном использовании производительность будет не очень.
(3) pfihr, здесь используется встроенная в 1С проверка типа по фасету для значения поля XDTO-объекта, так что, полагаю, добавить сюда ХPath совсем не получится )))
(6) AlX0id, ИМХО тот же, что и в RegExp от M$.
(7) Xershi, ниже я привел часть синтаксиса с примерами. В коде есть пример для проверки даты: ПроверитьСтроку("01.01.2012","\d\.\d\.\d") - сравните с описанием регулярных выражений ниже по тексту и попробуйте разобрать данный пример. Я сам с регулярками раза с третьего только разобрался, а первые два подхода вызвали лишь мысли о том, что пока мне это не сильно надо, но выглядит как-то сложно и времени потратить надо будет немало, а его, типа, у меня нет. Но когда действительно появилась необходимость в их освоении, то оказалось, что достаточно дня, чтобы разобраться.
(8) поэтому и говорю. Было бы не плохо чтобы эту тему разжевали более подробно. Так было бы быстрее освоить материал!
(9) Xershi, быстрее освоить материал - это взять и написать регулярки для тестирования каких-то реальных вещей. Например, даты, e-mail, адреса сайта, имени переменной, числа, почтового адреса с индексом, . - вот реализуйте каждый из них - и Вы сразу же станете специалистом. Описанной в статье информации для этого уже должно хватить. А если что-то непонятно - всегда есть гугл, он куда терпеливей иных учителей и никогда не отказывает пытливому уму в предоставлении ссылок на искомое.
Было бы не плохо добавить блок, который бы описывал как на практике это использовать.
А то после прочтения не стало понятнее как это употреблять.
(12) webester, если будет задача, я просто погуглю, а пока просто хотел, чтобы улучшили статью, чтобы начинающим не пришлось гуглить)
Кстати, господа, в notepad++ есть поиск и замена на основе регулярных выражений. Я так иногда на работе что-то искал и менял, чтобы потом в консоль запросов вставить, как список. Вот там как раз непочатый край для экспериментов с регулярными выражениями. Например, попробуйте все даты в тексте заменить на какую-то конкретную дату - уже расширите горизонты своего познания и огребете достаточно экспы для очередного левелапа )))
(15) AlX0id, (15) AlX0id, зачем Regex Buddy, когда есть это:
Здорово.
А не подскажете почему в конфигураторе при определении XTDO пакета визуально свойства pattern не видно?
(17) в определении типа тоже не увидел свойства pattern, хотя есть другие свойства фасета (максим. , миним. длины)
Регулярки это найс. Спасибо огромное автору за хорошую альтернативу внешним компонентам.
А теперь тестирование. За основу взял проверку адреса электронной почты:
Регулярка: "\w+@\w+\.\w+"
Текст проверки 1С:
На 100000 итераций код 1С отработал за 2сек, а регулярные выражения 63с
(18) karapuzzzz, а Вы кешировали объект XDTO или выполняли процедуру целиком? У Вас в коде правильным адресом будет и "%;№!@:?*!.", ибо вы не проверяете на "букву, цифру и подчеркивание" - реальный адрес куда сложнее. при том валидный "iem.mycompany@holding.com" не пройдет проверку по регулярке, ибо валидная "." приведет к ошибке. Т.е. не все так просто в действительности )))
(18) karapuzzzz, попробовал с кешем объекта XDTO и паттерном "[0-z]+@[0-z]+\.[0-z]+":
Время начала: 63 593 123 364 131
Длительность: 999 мс
Истинных: 100 000
Время начала: 63 593 123 365 130
Длительность: 280 мс
Код какой-то такой получился:
Класс! Просто фантастика. Круть неимоверная, зачёт однозначный.
Совершенно шикарная идея, и ведь правда работает. Неистово плюсую.
Если не секрет, как до такого додумались? Что натолкнуло?
(23) Yashazz, ну как бы тут было два момента: выгрузка отчета по схеме XSD, любезно предосиавленная ПФР, которая отказалась грузиться в пакет и вынудила исследовать механизм XDTO. Потом была статья на ИС, в которой кто-то реализовал алгоритм регулярок. Я было подумал, а не выгрузить ли мне пакет в модель с прикрученным типом и менять паттерн проверки у этого типа. И, в итоге, сработало как видите.
ЗЫ: про XDTO еще месяц назад ничего толком не знал, а теперь знаю о нем весьма много.
Если не секрет, что изучали для познания дзен XDTO? Сам толком не вкурил эту тему, но очень хочется досконально в этом разбираться.
"Чтобы в чем-то разобраться нужна задача и сержант с сапогом, периодически пинающим под зад" (Я)
Исходя из вышесказанного могу порекомендовать статьи "ХДТО - это просто" на Инфостарте (серия из трех статей, если не ошибаюсь - оттуда, в частности, почерпнута идея о сериализации модели). Ну и сержанта Вам с сапогом ))))
Кстати, у меня друг один все заставлял меня с регулярками разобраться - я болт забивал после прочтения пары строк из Вики. Но когда внезапно появилась задача, то я не только за день с ними вполне себе разобрался, но и написал механизм преобразования 1С-ной маски поля в регулярное выражение. правда тогда проверка была реализована на мелкософтовское регэкспе, но бывали случаи, когда СОМ тупо отваливался (баги нескольких платформ) и при инициализации любого СОМ-объекта система валилась с ошибкой. Исходя из этого мысль о реализации теста регулярок средствами платформы постоянно висела в голове. И как только я узнал, что в типах ХДТО есть возможность использовать паттерны проверки, то это сразу же материализовалось в вышеприведенный код.
Регулярные выражения — это удобнейшая вещь для решения многих задач по анализу какого-либо текста. К сожалению встроенный язык не предоставляет «родных» инструментов для работы с регулярными выражениями.
Но не все так плохо — никто не мешает использовать встроенный в Windows (в Windows 98 и выше) объект — VBScript.RegExp.
Весь приведенный ниже код работает как в версии 7.7 так и версиях 8.x.
Единственным отличием 7.7 от 8.x является строка создания объекта.
Кроме этого, для полного сходства кода в разных версиях, в коде версии 7.7 полезно определить вот такие переменные:
Хотя во многих конфигурациях эти переменные определены как глобальные.
Ниже описаны свойства и методы объекта VBScript.RegExp.
Свойства:
- Global. Ложь — искать до первого нахождения, Истина — искать во всем тексте. Значение по умолчанию — Ложь;
- IgnorCase. Ложь — учитывать регистр символов, Истина — не учитывать регистр символов. Значение по умолчанию — Ложь;
- Multiline. Ложь — однострочный объект, Истина — многострочный объект. Это свойство влияет на работу метасимволов ^ и $. Значение по умолчанию — Ложь;
- Pattern. Строка используемая как шаблон регулярного выражения. Чаще всего, говоря о регулярном выражении, люди имеют ввиду именно шаблон. О том, как составлять шаблоны можно узнать, например, тут.
Методы:
- Test(СтрокаТекста). Метод проверяет переданную в параметре строку на соответствие шаблону (например проверка корректности адреса эл. почты). Возвращаемые значение: Ложь — строка соответствует шаблону, Истина — строка не соответствует шаблону;
- Replace(СтрокаТекста, СтрокаЗамены). Ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены). Возвращаемые значения: измененный (возможно) параметр СтрокаТекста;
- Execute(СтрокаТекста). Ищет соответствующие шаблону вхождения в параметре СтрокаТекста. Возвращаемые значения: коллекция найденных подстрок.
Следующий пример ищет HTML теги в строке:
Использование в шаблоне круглых скобок (группировки) задействует коллекции SubMatces. Изменим шаблон в предыдущем примере таки образом:
Будут найдены не только теги, но и текст до и после тега. Для обработки такого шаблона, код будет выглядеть так:
Еще пример — простая функция для проверки корректности адреса электронной почты:
Если регулярные выражения используются часто, то будет разумно написать некую оболочку. Основные позиции таковы:
- Глобальная переменная, являющаяся объектом VBScript.RegExp;
- Инициализация глобальной переменной при запуске конфигурации или функция инициализации вызываемая по необходимости;
- Инкапсуляция методов объекта VBScript.RegExp.
На этом все, надеюсь данный материал Вам помог.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 2, средняя оценка: 5,00 из 5)
Dropbox — это один самых популярных сервисов облачного хранения данных. Подобному сервису облачного хранения
Сегодня я расскажу о WIA.ImageFile — полезной библиотеке, которая поможет решить некоторые пробелы встроенных
Функцию инициализации достаточно вставить в общий модуль с повторным использованием возвращаемых значений и тогда не потребуется глобальных переменных.
Вот пример из разрабатываемой сейчас конфы, где я активно использую регулярки.
Функция RegExp(Знач ШаблонВыражения = «») Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация();
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ИмяМакета = «ОбщийМакет.enRex32»;
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ИмяМакета = «ОбщийМакет.enRex64»;
КонецЕсли;
Попытка
КодВозврата = ПодключитьВнешнююКомпоненту(
ИмяМакета,
«RegEx»,
ТипВнешнейКомпоненты.Native);
Исключение
Возврат Ложь;
КонецПопытки;
Регулярные выражения (их еще называют regexp, или regex) — это механизм для поиска и замены какого-либо текста. К сожалению, встроенный язык 1С не предоставляет «родных» инструментов для работы с регулярными выражениями.
Но не все так плохо — никто не мешает использовать встроенный в Windows (в Windows 98 и выше) объект — VBScript.RegExp.
Чем это лучше простого поиска? Тем, что позволяет задать шаблон.
Например, вам дают задание найти в 200 страницах информации все даты рождения в формате ДД.ММ.ГГГГГ. Вам надо обработать её и передать дальше. Как это сделать с помощью простого поиска? Вы же не знаете заранее, какая именно дата будет.
А регулярное выражение позволяет задать шаблон «найди мне цифры в таком-то формате».
С этим разобрались. Так как же работать с регулярными выражениями в 1С?
Для начала необходимо создать объект VBScript.RegExp.
Окей, с этим разобрались, но что дальше? Дальше нам необходимо познакомиться со свойствами и методами нашего объекта. У объекта VBScript.RegExp есть 4 свойства:
Global – свойство типа булево, которое позволяет нам проверять строку до первого соответствия шаблону (Ложь) или по всему тексту (Истина);
IgnorCase – свойство типа булево, которое позволяет нам учитывать (Ложь) или не учитывать (Истина) регистр символов;
Multiline – свойство типа булево, которое позволяет нам работать в многострочный (Истина) или однострочный (Ложь) режим;
Pattern – строка используемая как шаблон регулярного выражения. Чаще всего, говоря о регулярном выражении, люди имеют ввиду именно шаблон.
Давайте договоримся, что в рамках нашей статьи мы будем использовать поиск по всему тексту, с учетом регистра символов, в однострочном режиме, тогда наш объект и его свойства можно объявить следующим образом:
Хочется отметить, что сразу при создании объекта VBScript.RegExp, его свойства типа булева хранят значение «Ложь», следовательно, в нашем случае правильнее будет написать
Со свойствами разобрались, теперь перейдем к методам. У объекта VBScript.RegExp есть три метода:
Test(СтрокаТекста). Метод проверяет переданную в параметре строку на соответствие шаблону (например, проверка корректности адреса эл. почты). Возвращаемые значение: Ложь — строка соответствует шаблону, Истина — строка не соответствует шаблону;
Execute(СтрокаТекста). Ищет соответствующие шаблону вхождения в параметре СтрокаТекста. Возвращаемые значения: коллекция найденных подстрок;
Replace(СтрокаТекста, СтрокаЗамены). Ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены). Возвращаемые значения: измененный (возможно) параметр СтрокаТекста.
Разберем каждый метод по отдельности, начнем с метода Test.
Пожалуй, самый простой метод объекта VBScript.RegExp. Работает как простой поиск — ищет в строке поиска, совпадения со строкой свойства Pattern, и если находит возвращает значение «Истина», иначе «Ложь».
Правильный ответ: Вариант 1.
Вариант 1 хоть и содержит точно такое же слово, как и в шаблоне, но первая буква слова заглавная, и так как у объекта VBScript.RegExp свойство IgnorCase не объявлено, а значит равно «Ложь», регистр важен и учитывается.
Разберем задачу посложнее, давайте представим, что нам необходимо, используя регулярные выражения создать процедуру, которая будет проверять введенный email адрес на корректность.
Для начала нужно внимательно изучить данные, которые мы хотим получить на выходе, и составить по ним шаблон. В email два разделителя — собачка «@» и точка «.».
Наш email должен содержать набор символов, затем собачку «@», затем снова набор символов, затем точка «.» и наконец набор символов. В результате у нас должно получится что-то вроде:
Таблица спецсимволов
\w - любой символ слова. Эквивалентно [A-Za-z0-9_].
\W - обратно "\w". Эквивалентно [^A-Za-z0-9_].
\d - цифра. Эквивалентно 3.
\D - НЕ цифра. Эквивалентно [^0-9].
Таблица квантификаторов
В рамках этой задачи нам необходимо проверить является ли введенный email адрес корректным, но как же нам это сделать? Ведь мы не можем указать бесконечное множество вариантов email адресов в свойство Pattern, а затем сравнивать их с введенной строкой.
Здесь на помощь нам приходят спецсимволы и квантификаторы, дело в том, что зачастую в параметр Pattern, записывают не какое-то определенное слово для поиска, а набор спецсимволов и квантификаторов, для получения желаемого результата, давайте попробуем и мы.
Используем нашу маску Символы@символы.символы, и попробуем составить шаблон для поиска используя спецсимволы и квантификаторы. Стоит заметить, что если мы попробуем использовать шаблон «.+@.+..+» то нужного результата мы не достигнем, дело в том что при такой записи, программа не сможет отделить спецсимвол «.», и просто символ точка «.», чтобы достичь желаемого результата нам необходимо воспользоваться экранизацией, спецсимвол «\», таким образом мы выделяем для программы символ точка «.», и он будет восприниматься не как спецсимвол, а как просто символ точка «.». У нас должно получиться «.+@.+\..+», таким образом программа отработает правильно. Так же возможно написание шаблона с помощью спецсимвола «\w». Используя спецсимвол «\w», у нас должно получиться шаблон «\w+@\w+\.\w+»
Перейдем к следующему методу объекта VBScript.RegExp это метод Execute.
В отличии от метода Test, метод Execute, ведет поиск соответствующих шаблону вхождений в строке-оригинале, и возвращает их в виде коллекции найденных подстрок, что даёт нам возможность работать с ними.
У метода Execute есть два свойства:
Count – содержит число найденных вхождений в строке-оригинале
Item – содержит коллекцию найденных подстрок
Перейдем к практике, давайте возьмем реальную задачу, есть XML файл, в котором нам необходимо найти все уникальные идентификаторы продукта, и вывести их на экран используя регулярные выражения.
Перейдем к последнему методу объекта VBScript.RegExp, это метод Replace.
Он ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены).
Перейдем к практике
Представьте, что у вас есть XML файл правил обмена данными между двумя базами 1С, фирма 1С выпустила обновление, и теперь наименование реквизита «СтавкиНДС» заменено на «СтавкаНДС», вам нужно используя регулярные выражения изменить XML файл чтобы обмен между информационными базами снова начал работать. Приступим.
В результате выполнения этой процедуры в переменную «Результат» будет записана исходная строка текста, но наименование реквизита «СтавкиНДС» переименуется в «СтавкаНДС» и правила обмена в формате XML будут работать.
В этой статье мы разобрали тему регулярных выражений в 1С. Поговорили об объекте VBScript.RegExp и его методах, а также разобрали на примерах, реальные задачи, которые можно решать с помощью регулярных выражений.
Статью подготовил Драчев Сергей, специалист по внедрению 1С партнерской сети "ИнфоСофт".
Читайте также: