понедельник, 29 августа 2016 г.

Регулярные выражения в CourseLab

Об использовании RegExp в «КурсЛабе» впервые подумал, когда понял, что в обычном условии сравнение строк в некоторых случаях происходит некорректно.


Подвернулась задача провести проверку пользовательского ввода, при которой верными будут считаться следующие значения: 0700, 07:00, 07.00, 07 00 и  07,00. Опять на ум из молодости вернулись «регэкспы».


Оказалось, что и в CourseLab при помощи JavaScript их можно использовать. Для этого обработчик надо разместить в папке проекта под названием «1» в файле «module.js».

Механизм для передачи значений переменных от этого файла «КурсЛабу» немного описан в разделе «Для опытных пользователей».


Вызов функции из действий объектов происходит следующим образом:


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


Затем проверяем кодом в файле module.js допустимые значения.


Затем проверяем кодом в файле module.js допустимые значения.

// RegWord
function RegWord()
{
CLV.oSlide["bylo"] = 'neverno';

//В переменную txt вношу значение поля ввода
var txt = CLV.oSlide["fulltext"];
var reps = 'a' + txt;
//Задаю шаблон регулярного выражения для 0700
var srch1 = "0700$";
var re1 = new RegExp(srch1,'i'); //Флаг i - независимости от регистра в конкретном примере не нужен, но оставлю для наглядности
var itog1 = reps.search(re1);
//Если в поле ввели 0700
if(itog1>0)
                {
                  CLV.oSlide["bylo"] = 'verno';
                }
//Задаю шаблон регулярного выражения для остальных значений
var srch2 = "07[.,: ]00$";
var re2 = new RegExp(srch2,'i');
var itog2 = reps.search(re2);

//Проверка ввода остальных допустимых комбинаций

if(itog2>0)
                {
                  CLV.oSlide["bylo"] = 'verno';
                }
    
itog1=0;
itog2=0;
srch1=0;
srch2=0;
re1=0;
re2=0;
}

Далее уже на основе сравнения введенного значения с шаблоном произвожу дальнейшие манипуляции уже в «КурсЛабе».


Этот пост в блоге я разместил не только для того, чтобы с кем-то поделиться информацией об использовании регулярных выражений в CourseLab, но и, возможно, чтобы получить новые знания для себя. Данная конструкция позволяет в конкретном примере корректно пропустить все значения кроме одного (x0700). Сейчас объясню почему.

Не владею на должном уровне RegExp или JS, но почему-то не получается задать «паттерн» с флагом начала и конца строки, например "^0700$". Такая конструкция не дает нужный результат, как будто в переменную поля ввода автоматически добавляется еще какой-то невидимый символ. Пытался проверить вводимые данные посимвольно – вроде ничего нет. Или же иным образом оформить шаблон нужно...

Из-за этой особенности приходится к введенному значению добавлять вперед символ (var reps = 'a' + txt;) и тогда уже сравнение происходит корректное, если вводится 5 символов (например, «07 00»). Если же 4, как в случае с «0700», то правильным засчитывается и один ложный вариант «x0700».Может, надо несколько иную конструкцию использовать, а не reps.search(re1). Пока ответа не нашел. Буду признателен, если кто подскажет.