0

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

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

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

在在线 javascript 正则表达式验证器 ( 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
};

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

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

4

1 回答 1

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}$应该可以工作。

于 2013-10-22T07:34:46.413 回答