Валидация и проверка введённых данных различного формата

Последние изменения: 15.10.2021

Практически в каждом боте есть потребность в получении данных определенного формата (текстовый формат, числовой, дата или время). Логики в таких случаях требует реализовать проверку ввода и/или форматирование к требуемому формату. Для этого используются следующие инструменты в Sherlock Platform:

  1. Для команды [Получение данных] указывается регулярное выражение для первичной проверки отправляемых данных
  2. В сценарии бота на получение данных выполняется сначала форматирование данных, а потом по необходимости дополнительная проверка

Далее в статье приведены примеры для проверки данных, ввод которых часто необходим в различных чат-ботах.

ФИО

Для корректной обработки ввода ФИО необходимо в настройках команды [Получение данных] выставить следующее регулярное выражение:

^[а-яА-Я _]*$

Данное регулярное выражение допускает ввод больших и маленьких русских букв и пробелов.

Далее полученную строку необходимо проверить на количество пробелов в ней и присутствие/отсутствие букв. Необходимо возвращать пользователя к вводу данных, если выполняются следующие условия:

(("#ClientName#".Split(' ').Length - 1) != 2) &&
("#ClientName#".Trim().Replace(" ", string.Empty).Length == 0)

Номер телефона

Для приведения телефона к требуемому формату рекомендуется использовать следующий алгоритм:

  1. Удалить из полученный строки все не цифровые символы
  2. В зависимости от длины строки заменить или добавить начальный символ 7 (по необходимости добавить также + перед 7)
  3. Если длина обработанной строки не равна 11 (12 с плюсом), то вывести сообщение об ошибке и перейти к повторному запросу телефона

Ниже приведен пример команд для реализации (каждая строка задается отдельной командой [Установка переменной контекста]):

ClientPhone = new System.Text.RegularExpressions.Regex("[^0-9]").Replace("#ClientPhone#","")
ClientPhone = "+7" + "#ClientPhone#".Substring(1), если "#ClientPhone#".Length == 11
ClientPhone = "+7#ClientPhone#", если "#ClientPhone#".Length==10

Email

Для проверки даты необходимо в настройках команды [Получение данных] выставить следующее регулярное выражение:

([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*.[a-z]{2,6}

Дата

Для проверки даты необходимо в настройках команды [Получение данных] выставить следующее регулярное выражение:

^(?:(?:31(\.)(?:0[13578]|1[02]))\1|(?:(?:29|30)(\.)(?:0[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0[1-9]|1\d|2[0-8])(\.)(?:(?:0[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Данное регулярное выражение обрабатывает все возможные варианты даты, включая високосные годы. 

Для форматирования даты и приведения к требуемому формату (в примере ГГГГ.ММ.ДД) можно использовать следующие команды (каждая строка задается отдельной командой [Установка переменной контекста]):

day = DateTime.ParseExact("#date#", "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture).Day.ToString();
month = DateTime.ParseExact("#date#", "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture).Month.ToString();
year = DateTime.ParseExact("#date#", "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture).Year.ToString();

newDate = "#year#.#month#.#day#"

Время

Преобразование времени может выглядеть следующим образом:

 string time = "9-18";
string[] timeArray = time.Split('-');
string time1 = timeArray[0];
string time2 = timeArray[1];
string newTime = timeArray[0] + ":00-" + timeArray[1] + ":00";

В результате произойдет преобразование к следующему виду:

9:00-18:00

Буквенный ответ

Для возможности ввода только букв необходимо использовать для команды [Получение данных] регулярное выражение:

^[а-яА-Я]*$

Данное регулярное выражение позволит вводить только буквы без пробелов и других символов/цифр.

Цифровой ответ

Для возможности ввода только цифр необходимо для команды [Получение данных] регулярное выражение:

^[0-9]*$

Данное регулярное выражение позволит вводить только цифры без пробелов и других символов/букв.

Помогла ли вам статья?