EmailAddressAttribute
这个 EmailAddressAttribute 是用来验证输入的邮箱地址是否合法, 在 dotnetframework 下的实现是用一个很复杂正则表达式去验证的, 而 dotnetcore 下的实现则比较简单, 并没有使用正则表达式去验证, 只是验证了输入是否包含而且仅包含一个 "@", 并且 "@" 不是第一个字符也不是最后一个字符, 具体可以参考下面的链接
dotnet fx 472 使用的正则表达式如下 (看到我就已经头晕了...):
const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";
需要注意的还有一点, 就是上图中的 AppSettings.DisableRegEx, 来看实现:
可以看到默认是 false, 然而从 net472 之后默认就会是 true, 会表现出和 .netcore 一致的行为, 然而我用的是 net471, 于是就发现了不一致,,, 从上面的截图可以看到我们也可以在 App.config/web.config 文件中设置 AppSettings 节点, 设置 key 为 dataAnnotations:dataTypeAttribute:disableRegEx ,value 为 true 来禁用使用正则.
dotnet fx472 source
vcmU=" />
dotnet core source
dotnet core 实现源码
来源: https://www.2cto.com/kf/201904/804503.html