EmailAddressAttribute验证规则

时间:2013-06-07 01:51:27

标签: c# .net asp.net-mvc regex data-annotations

我一直在我的代码中使用EmailAddressAttribute(来自System.ComponentModel.DataAnnotations),它一直很好用。 BA和测试人员需要了解有关如何验证电子邮件地址的规则。我可以制作正则表达式的头部和尾部,因为它长达900个字符并且我的正则表达式技能是有限的。

有人能用简单的语言向我解释规则吗?

感谢。

1 个答案:

答案 0 :(得分:4)

基本上,在电子邮件地址字符串中,您有“@”符号之前和之后的文本。

文本中的每个字符都应符合2条规则:

  1. [a-z]|\d|[!#\$%&'*+-/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
  2. 我列出的一些unicode代码规则。
  3. 第一条规则意味着文本中的字符可以是以下之一:

    • A-Z
    • 任何数字
    • !#\$%&'*+-/=\?\^_`{\|}~
    • 之一
    • 在unicode范围\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF

    然后文本由.

    分隔

    应该是这样的:

    private static Regex _regex = new Regex(@"^
    (
        (
            ([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])))\.?$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);