Пользовательская проверка Knockout JS, странное поведение с регулярным выражением

Я использую выражение регулярного выражения для проверки доменного имени (мой вопрос здесь не в том, чтобы определить, является ли регулярное выражение хорошим или нет!).

Вот регулярное выражение, которое я использую: ^(?:[a-zA-Z0-9]+(?:-*[a-zA-Z0-9])*.)+[a-zA-Z]{2 ,6}$

Используя это регулярное выражение в моем бэкэнде C#, доменное имя org.comabcd помечается как недопустимое (поскольку в расширении доменного имени 7 символов). Так что это здорово!

Используя это регулярное выражение в онлайн-валидаторе регулярных выражений javascript (http://regexpal.com/), я обнаружил такое же поведение. Это все равно здорово!!

Но мой интерфейс пользовательского интерфейса использует это регулярное выражение в пользовательской проверке Knockout JS для пользовательского DataAnnotationsModelValidator, и доменное имя помечается как действительное.

Вот код, который я использую:

ko.validation.rules["domainname"] = {
    validator: (val: any, validate: boolean) => {
         var regex = new RegExp("^(?:[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9])*\.)+[a-zA-Z]{2,6}$");
        return regex.test(val);
    },
message: Localization.validation_domain_name_invalid_format
};

Я знаю, что валидатор работает «немного», потому что при попытке добавить цифры в расширение доменного имени он правильно помечается как недействительный.

Любая идея, что происходит, почему регулярное выражение, кажется, используется неправильно?


person Normand Bedard    schedule 21.10.2013    source источник
comment
попробуйте сделать это как литерал регулярного выражения, поэтому не используйте регулярное выражение, просто var regex = /^(?:[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9])*\.)+[a-zA-Z]{2,6}$/. Боковое примечание: проверка нокаута уже имеет валидатор шаблона, вы просто передаете строку регулярного выражения, если это вам нужно   -  person Thewads    schedule 21.10.2013
comment
Использование литерала регулярного выражения работает отлично. Все еще не уверен, что понял, в чем разница и почему RegExp не работает так, как я ожидал. Но это работает! Благодарю вас!   -  person Normand Bedard    schedule 21.10.2013


Ответы (1)


Если вы знаете, что используете в качестве своего регулярного выражения во время компиляции, а не создаете его на лету, вам следует использовать литерал регулярного выражения:

var regex = /^(?:[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9])*\.)+[a-zA-Z]{2,6}$/

Литералы компилируются при загрузке скрипта, тогда как RegExp может изменяться во время выполнения, поэтому его производительность несколько ниже.

Что касается того, почему он работает неправильно, вероятно, это связано с тем, что вы неправильно экранируете свою строку. При использовании регулярного выражения в качестве строки в RegExp вы должны экранировать любые обратные косые черты, поэтому изменение выражения на ^(?:[a-zA-Z0-9]+(?:\\-*[a-zA-Z0-9])*\\.)+[a-zA-Z]{2,6}$ должно работать.

person Thewads    schedule 22.10.2013