Особенности регулярных выражений в Salebot
Любой начинающий ботодел рано или поздно должен освоить такой мощный инструмент как регулярные выражения. Это специализированные шаблоны, позволяющие обрабатывать всевозможные комбинации текста. Телефонный номер, адрес электронной почты или веб-страницы.
Вот некоторые примеры из документации Salebot (именно некоторые - мне там нравятся не все):
Дата в формате 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
(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(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 😃