我正在使用正则表达式来验证域名(我的问题不在于确定正则表达式是否正常!)。
这是我正在使用的正则表达式:^(?:[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
};
我知道验证器“有点”工作,因为当尝试在域名扩展名中使用数字时,它会被正确标记为无效。
知道发生了什么,为什么正则表达式似乎没有正确使用?
答案 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}$
应该有效。