Knockout JS自定义验证与正则表达式的奇怪行为

时间:2013-10-21 13:40:45

标签: knockout.js customvalidator

我正在使用正则表达式来验证域名(我的问题不在于确定正则表达式是否正常!)。

这是我正在使用的正则表达式:^(?:[a-zA-Z0-9] +(?: - * [a-zA-Z0-9])*。)+ [a-zA-Z ] {2,6-} $

在我的C#后端使用此正则表达式,域名org.comabcd被标记为无效(因为域名扩展名中有7个字符)。所以这很棒!

在在线javascript regex验证器(http://regexpal.com/)中使用此正则表达式,我发现了相同的行为。这仍然很棒!!

但是,我的UI前端在自定义DataAnnotationsModelValidator上的Knockout JS自定义验证中使用此正则表达式,域名被标记为有效。

以下是我正在使用的代码:

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
};

我知道验证器“有点”工作,因为当尝试在域名扩展名中使用数字时,它会被正确标记为无效。

知道发生了什么,为什么正则表达式似乎没有正确使用?

1 个答案:

答案 0 :(得分: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}$应该有效。