Практически в каждом боте есть потребность в получении данных определенного формата (текстовый формат, числовой, дата или время). Логики в таких случаях требует реализовать проверку ввода и/или форматирование к требуемому формату. Для этого используются следующие инструменты в Sherlock Platform:
- Для команды [Получение данных] указывается регулярное выражение для первичной проверки отправляемых данных
- В сценарии бота на получение данных выполняется сначала форматирование данных, а потом по необходимости дополнительная проверка
Далее в статье приведены примеры для проверки данных, ввод которых часто необходим в различных чат-ботах.
ФИО
Для корректной обработки ввода ФИО необходимо в настройках команды [Получение данных] выставить следующее регулярное выражение:
^[а-яА-Я _]*$
Данное регулярное выражение допускает ввод больших и маленьких русских букв и пробелов.
Далее полученную строку необходимо проверить на количество пробелов в ней и присутствие/отсутствие букв. Необходимо возвращать пользователя к вводу данных, если выполняются следующие условия:
(("#ClientName#".Split(' ').Length - 1) != 2) &&
("#ClientName#".Trim().Replace(" ", string.Empty).Length == 0)
Номер телефона
Для приведения телефона к требуемому формату рекомендуется использовать следующий алгоритм:
- Удалить из полученный строки все не цифровые символы
- В зависимости от длины строки заменить или добавить начальный символ 7 (по необходимости добавить также + перед 7)
- Если длина обработанной строки не равна 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
Для проверки даты необходимо в настройках команды [Получение данных] выставить следующее регулярное выражение:
([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]*$
Данное регулярное выражение позволит вводить только цифры без пробелов и других символов/букв.