Лайфхаки Salebot
January 24, 2023

Особенности регулярных выражений в Salebot

Любой начинающий ботодел рано или поздно должен освоить такой мощный инструмент как регулярные выражения. Это специализированные шаблоны, позволяющие обрабатывать всевозможные комбинации текста. Телефонный номер, адрес электронной почты или веб-страницы.

Вот некоторые примеры из документации Salebot (именно некоторые - мне там нравятся не все):

Номер кредитки:
[0-9]{13,16}

Дата в формате YYYY-MM-DD:
[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[01])

UPD. Более строгая проверка:
(19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)

Дата в формате DD/MM/YYYY:
(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d

Дата в формате DD.MM.YYYY:

(0?[1-9]|[12][0-9]|3[01]).(0?[1-9]|1[012]).((19|20)\d\d)

Целые числа и числа с плавающей точкой (разделитель точка):
\-?\d+(\.\d{0,})?

UUID:
^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$

E-mail:
^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$

Время в формате HH:MM:SS:
^([0-1]\d|2[0-3])(:[0-5]\d){2}$

Часто случается, что в сервисах типа Regex101 регулярка работает идеально, а в СБ - молчок. Опытным путём я пришёл к выводу, что необходимо в шаблон регулярки добавлять обработку символов, окружающих искомый текст.

Например, если нам нужно найти номер телефона, обычно мы бы использовали следующий шаблон:

\+?(7|8)+[0-9- ()]{10,}

В сэйлботе он сработает в случае, если введён только номер. Но не сработает, если номер будет окружён другим текстом. Например:

Мой телефонный номер +7(954)123 56-89. Запишите его!

В этом случае необходимо учесть "левые" символы. В этом случае регулярное выражение в условии блока будет выглядеть так:

[0-9а-яА-ЯёЁ.,!?\- ]*\+?(7|8)+[0-9- ()]{10,}[0-9а-яА-ЯёЁ.,!?\- ]*

Но это условие нужно, чтобы пользователь попал в определённый блок. Дальше нужно как-то этот номер извлечь.

Обрабатываем переменную #{question}, чтобы достать номер:

_n = #{question} n = findall('((7|8)+[0-9- ()]{10,})', '#{_n}', 1) client.phone = normalizePhone(n[0][0])

Кстати, чтобы блок срабатывал, когда бы пользователю не заблагорассудилось ввести номер, задействуем тёмно-серый блок - несостояние с условием, а в выборе соответствия - регулярное выражение.

Настройки блока

Батут работает:

Проверяем работу блока в телеграм-боте

Благодарность в виде доната приветствуется 😉. Как говорят восточные зулусы, buy me a coffee 😃

👇