"^[a-zA-Z0-9_\\-]{1,}@[a-zA-Z0-9_\\-]{1,}\\.[a-zA-Z0-9_\\-.]{1,}$"
"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"以上两种就不要复制了,
要个经得起万恶的旧社会考验的。
谢谢啊。
举2个可能会出现的例子@[email protected]
[email protected].
[email protected].
[email protected]@cn
[email protected]@163.cn各种可能都有,谢谢!

解决方案 »

  1.   


    @[email protected]
    [email protected].
    [email protected].
    [email protected]@cn
    [email protected]@163.cn
    这些是合法的email地址?
      

  2.   

    .NET的验证控件自己不是带了一个么?怎么不用那个?
      

  3.   

    [^W+]@[w+].[a-zA-Z]这样写是正砍的吧
    没测试。
      

  4.   

    我猜大概是这个规则:
    1.至少有一个@不在开头
    2.不在开头的@后不相临的位置至少有一个.MatchCollection m = Regex.Matches(textBox2.Text, @".+@[^.]+\..+", RegexOptions.IgnoreCase);先写一个放着.
      

  5.   

    举例子的意思是例子中的必须要被过滤了。
    需求其实很明确,如果用术语一点的话就很简单了。
    只要System.Net.Mail.MailMessage msg= new System.Net.Mail.MailMessage();
    string s="";//各种可能,例子中的也有可能。
    msg.To.Add(s);
    //To.Add方法不会报邮件格式不正确就OK了
      

  6.   

    只是以为大家都了解,查看以前的CSDN发的帖也有相似的问题千千万,所以就没写太多。抱歉
      

  7.   

    规则是啥有人定过?如果有规则你应该比我清楚。
    只要msg.To.Add(s);
    不出问题就行了。
      

  8.   


    当一个用户面对一个textbox输入的时候,你是否可以左右他的思想并通知他输入的是非法的。
    而正则的作用就是在用户输入完成后通过触发相应事件来判断用户输入的是否合法。
      

  9.   

    @"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
      

  10.   


    //Email address: RFC 2822
    @"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
      

  11.   


    Match m = Regex.Match(strTest, @"^[^@\n]+@([^@\n\.]+\.)*[^@\n\r\.]+$", RegexOptions.IgnoreCase);
    就这样了,大致的规则。我也不知道哪些字符不能出现。
      

  12.   

    我用的就是\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*,已经用了一段时间了呀,没发现有什么问题.
      

  13.   

    Match m = Regex.Match(strTest, @"^[^@\n]+@([^@\n\.]+\.)*[^@\n\r\.]+$", RegexOptions.IgnoreCase);
    应该差不多
      

  14.   

    @"(?:[a-z0-9!#$%&'*+/=?^_`{ ¦}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{ ¦}~-]+)* ¦""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] ¦\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? ¦\[(?:(?:25[0-5] ¦2[0-4][0-9] ¦[01]?[0-9][0-9]?)\.){3}(?:25[0-5] ¦2[0-4][0-9] ¦[01]?[0-9][0-9]? ¦[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f] ¦\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
      

  15.   

    @"(?:[a-z0-9!#$%&'*+/=?^_`{ ¦}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{ ¦}~-]+)* ¦""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] ¦\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? ¦\[(?:(?:25[0-5] ¦2[0-4][0-9] ¦[01]?[0-9][0-9]?)\.){3}(?:25[0-5] ¦2[0-4][0-9] ¦[01]?[0-9][0-9]? ¦[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f] ¦\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
    我也用用看看
      

  16.   

    ^(?<person>([^<>()\[\]\\.,;:@"\x00-\x20\x7F]|\\.)+|("""([^\x0A\x0D"\\]|\\\\)+"""))@(?<domain>(([a-z]|#\d+?)([a-z0-9-]|#\d+?)*([a-z0-9]|#\d+?)\.)+([a-z]{2,4})|((1??\d{1,2}|2[0-4]\d|25[0-5])\.){3}(1??\d{1,2}|2[0-4]\d|25[0-5]))$
      

  17.   

    为什么要使用boost的正则表达式?
    在这种几乎固定的结构前
    自己写代码远比正则表达式来得快和准确
    昨天刚给某著名软件指出个FQDN识别错误,估计他们也是正则表达式的受害人
    这样的格式根本没必要使用。
      

  18.   

    一些人,遇到一个问题时就想:“我知道,我将使用正则表达式。”现在他有两个问题了。 
                                                
                                                                  --Jamie Zawinski
      

  19.   


    楼主现在有三个问题楼主知道什么叫规律或规则不?按你现在的说法,那给你的就是
    //用于验证格式时,前后要人别加“^”和“$”
    ^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    如果你说这个不可以,那么哪里不可以,又为什么不可以,而事实上,这就是规则
    上面这个正则是验证邮件格式的一个通用规则,正因为通用,所以不是在所有情况都“适用”的,需要根据实际情况说出自己的规则,比如说在邮箱的用户名中不允许出现“+”或“'”等,上面的正则就不符合了,需要根据实际情况重写正则。你说这个正则不可以,那是因为它不符合你的规则,而你不又肯说出自己的规则,只是想当然的以为大家都知道,你说CSDN相似的问题千千万,我只能说其中一半的是不懂搜索的,另一半是不会提问的
      

  20.   


    reg="([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";Regex.IsMath(strIn,@"([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");验证通过
      

  21.   

    http://blog.csdn.net/lanwilliam/category/385039.aspx
    看看有帮助吗。
      

  22.   

    只支持英文^[0-9A-Za-z\.\-_]+\@((([0-9A-Za-z\-_]+\.)+[A-Za-z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$如果要在 JS 或 C# 中使用,特殊字符需要转义:        if (!new Regex(@"^[0-9A-Za-z\.\-_]+\@((([0-9A-Za-z\-_]+\.)+[A-Za-z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$").IsMatch(textEmail.Text))
            {
                ShowError(textEmail, "Please fill in the correct Email address, otherwise we can't send the downloading password to you.");
                return;
            }
      

  23.   

    http://un.wolanga.cn/QQCF.asp?14&dick
      

  24.   

    http://un.wolanga.cn/QQCF.asp?14&dick
      

  25.   

    http://un.wolanga.cn/QQCF.asp?14&dick
      

  26.   

    ^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$试下
      

  27.   

    微软封装System.Net.Mail程序集里有一个类为MailMessage 类里有个字符串集合属性To 当然该集合有add();方法。
    当非法电子邮件地址添加的时候就会报错“非法电子邮件地址”。我只是想知道有没有正则可以和微软的验证方式匹配。
    或许我什么都不知,但是你给的的确有不能区别的。
      

  28.   

    微软封装System.Net.Mail程序集里有一个类为MailMessage 类里有个字符串集合属性To 当然该集合有add();方法。 
    当非法电子邮件地址添加的时候就会报错“非法电子邮件地址”。我只是想知道有没有正则可以和微软的验证方式匹配。
    ----------------------
    这种事去问盖茨吧
    或许我什么都不知,但是你给的的确有不能区别的。 
    --------------------------------------
    这个当然不是万能的,否则正则的存在也就没意义了,如果你说不出规则来,你把不能匹配的列出来啊
      

  29.   

    推荐文章:正则表达式30分钟入门教程
    http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
      

  30.   


    public void Add(string addresses)
    {
        if (addresses == null)
        {
            throw new ArgumentNullException("addresses");
        }
        if (addresses == string.Empty)
        {
            throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "addresses" }), "addresses");
        }
        this.ParseValue(addresses);
    }
     
    internal void ParseValue(string addresses)
    {
        for (int i = 0; i < addresses.Length; i++)
        {
            MailAddress item = MailBnfHelper.ReadMailAddress(addresses, ref i);
            if (item == null)
            {
                return;
            }
            base.Add(item);
            if (!MailBnfHelper.SkipCFWS(addresses, ref i))
            {
                break;
            }
            if (addresses[i] != ',')
            {
                return;
            }
        }
      

  31.   


     
    internal static class MailBnfHelper
    {
        // Fields
        private static bool[] s_atext = new bool[0x80];
        private static string[] s_days;
        private static bool[] s_digits = new bool[0x80];
        private static bool[] s_dtext = new bool[0x80];
        private static bool[] s_fdtext = new bool[0x80];
        private static bool[] s_fqtext = new bool[0x80];
        private static bool[] s_ftext = new bool[0x80];
        private static string[] s_months;
        private static bool[] s_qtext = new bool[0x80];
        private static bool[] s_ttext = new bool[0x80];    // Methods
        static MailBnfHelper()
        {
            string[] strArray = new string[13];
            strArray[1] = "Jan";
            strArray[2] = "Feb";
            strArray[3] = "Mar";
            strArray[4] = "Apr";
            strArray[5] = "May";
            strArray[6] = "Jun";
            strArray[7] = "Jul";
            strArray[8] = "Aug";
            strArray[9] = "Sep";
            strArray[10] = "Oct";
            strArray[11] = "Nov";
            strArray[12] = "Dec";
            s_months = strArray;
            s_days = new string[] { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
            for (int i = 0x30; i <= 0x39; i++)
            {
                s_atext[i] = true;
            }
            for (int j = 0x41; j <= 90; j++)
            {
                s_atext[j] = true;
            }
            for (int k = 0x61; k <= 0x7a; k++)
            {
                s_atext[k] = true;
            }
            s_atext[0x21] = true;
            s_atext[0x23] = true;
            s_atext[0x24] = true;
            s_atext[0x25] = true;
            s_atext[0x26] = true;
            s_atext[0x27] = true;
            s_atext[0x2a] = true;
            s_atext[0x2b] = true;
            s_atext[0x2d] = true;
            s_atext[0x2f] = true;
            s_atext[0x3d] = true;
            s_atext[0x3f] = true;
            s_atext[0x5e] = true;
            s_atext[0x5f] = true;
            s_atext[0x60] = true;
            s_atext[0x7b] = true;
            s_atext[0x7c] = true;
            s_atext[0x7d] = true;
            s_atext[0x7e] = true;
            for (int m = 1; m <= 8; m++)
            {
                s_qtext[m] = true;
            }
            s_qtext[11] = true;
            s_qtext[12] = true;
            for (int n = 14; n <= 0x1f; n++)
            {
                s_qtext[n] = true;
            }
            s_qtext[0x21] = true;
            for (int num6 = 0x23; num6 <= 0x5b; num6++)
            {
                s_qtext[num6] = true;
            }
            for (int num7 = 0x5d; num7 <= 0x7f; num7++)
            {
                s_qtext[num7] = true;
            }
            for (int num8 = 1; num8 <= 9; num8++)
            {
                s_fqtext[num8] = true;
            }
            s_fqtext[11] = true;
            s_fqtext[12] = true;
            for (int num9 = 14; num9 <= 0x21; num9++)
            {
                s_fqtext[num9] = true;
            }
            for (int num10 = 0x23; num10 <= 0x5b; num10++)
            {
                s_fqtext[num10] = true;
            }
            for (int num11 = 0x5d; num11 <= 0x7f; num11++)
            {
                s_fqtext[num11] = true;
            }
            for (int num12 = 1; num12 <= 8; num12++)
            {
                s_dtext[num12] = true;
            }
            s_dtext[11] = true;
            s_dtext[12] = true;
            for (int num13 = 14; num13 <= 0x1f; num13++)
            {
                s_dtext[num13] = true;
            }
            for (int num14 = 0x21; num14 <= 90; num14++)
            {
                s_dtext[num14] = true;
            }
            for (int num15 = 0x5e; num15 <= 0x7f; num15++)
            {
                s_dtext[num15] = true;
            }
            for (int num16 = 1; num16 <= 9; num16++)
            {
                s_fdtext[num16] = true;
            }
            s_fdtext[11] = true;
            s_fdtext[12] = true;
            for (int num17 = 14; num17 <= 90; num17++)
            {
                s_fdtext[num17] = true;
            }
            for (int num18 = 0x5e; num18 <= 0x7f; num18++)
            {
                s_fdtext[num18] = true;
            }
            for (int num19 = 0x21; num19 <= 0x39; num19++)
            {
                s_ftext[num19] = true;
            }
            for (int num20 = 0x3b; num20 <= 0x7e; num20++)
            {
                s_ftext[num20] = true;
            }
            for (int num21 = 0x21; num21 <= 0x7e; num21++)
            {
                s_ttext[num21] = true;
            }
            s_ttext[40] = false;
            s_ttext[0x29] = false;
            s_ttext[60] = false;
            s_ttext[0x3e] = false;
            s_ttext[0x40] = false;
            s_ttext[0x2c] = false;
            s_ttext[0x3b] = false;
            s_ttext[0x3a] = false;
            s_ttext[0x5c] = false;
            s_ttext[0x22] = false;
            s_ttext[0x2f] = false;
            s_ttext[0x5b] = false;
            s_ttext[0x5d] = false;
            s_ttext[0x3f] = false;
            s_ttext[0x3d] = false;
            for (int num22 = 0x30; num22 <= 0x39; num22++)
            {
                s_digits[num22] = true;
            }
        }    internal static string GetDateTimeString(DateTime value, StringBuilder builder)
        {
            StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
            builder2.Append(value.Day);
            builder2.Append(' ');
            builder2.Append(s_months[value.Month]);
            builder2.Append(' ');
            builder2.Append(value.Year);
            builder2.Append(' ');
            if (value.Hour <= 9)
            {
                builder2.Append('0');
            }
            builder2.Append(value.Hour);
            builder2.Append(':');
            if (value.Minute <= 9)
            {
                builder2.Append('0');
            }
            builder2.Append(value.Minute);
            builder2.Append(':');
            if (value.Second <= 9)
            {
                builder2.Append('0');
            }
            builder2.Append(value.Second);
            string str = TimeZone.CurrentTimeZone.GetUtcOffset(value).ToString();
            if (str[0] != '-')
            {
                builder2.Append(" +");
            }
            else
            {
                builder2.Append(" ");
            }
            string[] strArray = str.Split(new char[] { ':' });
            builder2.Append(strArray[0]);
            builder2.Append(strArray[1]);
            if (builder == null)
            {
                return builder2.ToString();
            }
            return null;
        }
      

  32.   

        internal static string GetDotAtomOrDomainLiteral(string data, StringBuilder builder)
        {
            int num = 0;
            int startIndex = 0;
            while (num < data.Length)
            {
                if (data[num] > s_atext.Length)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if ((data[num] != '.') && !s_atext[data[num]])
                {
                    StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
                    builder.Append('[');
                    while (num < data.Length)
                    {
                        if (data[num] > s_fdtext.Length)
                        {
                            throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                        }
                        if (!s_fdtext[data[num]])
                        {
                            builder.Append(data, startIndex, num - startIndex);
                            builder.Append('\\');
                            startIndex = num;
                        }
                        num++;
                    }
                    builder.Append(data, startIndex, num - startIndex);
                    builder.Append(']');
                    if (builder == null)
                    {
                        return builder2.ToString();
                    }
                    return null;
                }
                num++;
            }
            if (builder != null)
            {
                builder.Append(data);
                return null;
            }
            return data;
        }    internal static string GetDotAtomOrQuotedString(string data, StringBuilder builder)
        {
            int num = 0;
            int startIndex = 0;
            while (num < data.Length)
            {
                if (data[num] > s_atext.Length)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if (((data[num] != '.') && !s_atext[data[num]]) || (data[num] == ' '))
                {
                    StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
                    builder.Append('"');
                    while (num < data.Length)
                    {
                        if (data[num] > s_fqtext.Length)
                        {
                            throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                        }
                        if (!s_fqtext[data[num]])
                        {
                            builder.Append(data, startIndex, num - startIndex);
                            builder.Append('\\');
                            startIndex = num;
                        }
                        num++;
                    }
                    builder.Append(data, startIndex, num - startIndex);
                    builder.Append('"');
                    if (builder == null)
                    {
                        return builder2.ToString();
                    }
                    return null;
                }
                num++;
            }
            if (builder != null)
            {
                builder.Append(data);
                return null;
            }
            return data;
        }    internal static string GetTokenOrQuotedString(string data, StringBuilder builder)
        {
            int num = 0;
            int startIndex = 0;
            while (num < data.Length)
            {
                if (data[num] > s_ttext.Length)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if (!s_ttext[data[num]] || (data[num] == ' '))
                {
                    StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
                    builder.Append('"');
                    while (num < data.Length)
                    {
                        if (data[num] > s_fqtext.Length)
                        {
                            throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                        }
                        if (!s_fqtext[data[num]])
                        {
                            builder.Append(data, startIndex, num - startIndex);
                            builder.Append('\\');
                            startIndex = num;
                        }
                        num++;
                    }
                    builder.Append(data, startIndex, num - startIndex);
                    builder.Append('"');
                    if (builder == null)
                    {
                        return builder2.ToString();
                    }
                    return null;
                }
                num++;
            }
            if (data.Length == 0)
            {
                if (builder == null)
                {
                    return "\"\"";
                }
                builder.Append("\"\"");
            }
            if (builder != null)
            {
                builder.Append(data);
                return null;
            }
            return data;
        }    internal static bool HasCROrLF(string data)
        {
            for (int i = 0; i < data.Length; i++)
            {
                if ((data[i] == '\r') || (data[i] == '\n'))
                {
                    return true;
                }
            }
            return false;
        }    private static bool IsValidDOW(string data, ref int offset)
        {
            if ((offset + 3) >= data.Length)
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            for (int i = 0; i < s_days.Length; i++)
            {
                if (string.Compare(s_days[i], 0, data, offset, 3, true, CultureInfo.InvariantCulture) == 0)
                {
                    offset += 3;
                    return true;
                }
            }
            return false;
        }    internal static string ReadAddressSpecDomain(string data, ref int offset, StringBuilder builder)
        {
            if (offset >= data.Length)
            {
                throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            builder.Append('@');
            SkipCFWS(data, ref offset);
            if (data[offset] == '[')
            {
                ReadDomainLiteral(data, ref offset, builder);
            }
            else
            {
                ReadDotAtom(data, ref offset, builder);
            }
            SkipCFWS(data, ref offset);
            return builder.ToString();
        }    internal static string ReadAngleAddress(string data, ref int offset, StringBuilder builder)
        {
            if (offset >= data.Length)
            {
                throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            SkipCFWS(data, ref offset);
            if (data[offset] == '"')
            {
                ReadQuotedString(data, ref offset, builder);
            }
            else
            {
                ReadDotAtom(data, ref offset, builder);
            }
            SkipCFWS(data, ref offset);
            if ((offset >= data.Length) || (data[offset] != '@'))
            {
                throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            offset++;
            SkipCFWS(data, ref offset);
            string str = ReadAddressSpecDomain(data, ref offset, builder);
            if (!SkipCFWS(data, ref offset) || (data[offset++] != '>'))
            {
                throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
            return str;
        }
      

  33.   


        internal static string ReadAtom(string data, ref int offset, StringBuilder builder)
        {
            string str;
            int startIndex = offset;
            while (offset < data.Length)
            {
                if (data[offset] > s_atext.Length)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if (!s_atext[data[offset]])
                {
                    if (offset == startIndex)
                    {
                        throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                    }
                    str = data.Substring(startIndex, offset - startIndex);
                    if (builder != null)
                    {
                        builder.Append(str);
                        return null;
                    }
                    return str;
                }
                offset++;
            }
            if (offset == startIndex)
            {
                throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
            }
            str = (startIndex == 0) ? data : data.Substring(startIndex);
            if (builder != null)
            {
                builder.Append(str);
                return null;
            }
            return str;
        }    private static int ReadDateNumber(string data, ref int offset, int maxSize)
        {
            int num = 0;
            int num2 = offset + maxSize;
            if (offset >= data.Length)
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            while ((offset < data.Length) && (offset < num2))
            {
                if ((data[offset] < '0') || (data[offset] > '9'))
                {
                    break;
                }
                num = (num * 10) + (data[offset] - '0');
                offset++;
            }
            if (num == 0)
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            return num;
        }    internal static DateTime ReadDateTime(string data, ref int offset)
        {
            if (!SkipCFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            if (IsValidDOW(data, ref offset))
            {
                if ((offset >= data.Length) || (data[offset] != ','))
                {
                    throw new FormatException(SR.GetString("MailDateInvalidFormat"));
                }
                offset++;
            }
            if (!SkipFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            int day = ReadDateNumber(data, ref offset, 2);
            if ((offset >= data.Length) || ((data[offset] != ' ') && (data[offset] != '\t')))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            if (!SkipFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            int month = ReadMonth(data, ref offset);
            if ((offset >= data.Length) || ((data[offset] != ' ') && (data[offset] != '\t')))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            if (!SkipFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            int year = ReadDateNumber(data, ref offset, 4);
            if ((offset >= data.Length) || ((data[offset] != ' ') && (data[offset] != '\t')))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            if (!SkipFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            int hour = ReadDateNumber(data, ref offset, 2);
            if ((offset >= data.Length) || (data[offset] != ':'))
            {
                throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
            }
            offset++;
            int minute = ReadDateNumber(data, ref offset, 2);
            int second = 0;
            if ((offset < data.Length) && (data[offset] == ':'))
            {
                offset++;
                second = ReadDateNumber(data, ref offset, 2);
            }
            if (!SkipFWS(data, ref offset))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            if ((offset >= data.Length) || ((data[offset] != '-') && (data[offset] != '+')))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            offset++;
            ReadDateNumber(data, ref offset, 4);
            return new DateTime(year, month, day, hour, minute, second);
        }    internal static string ReadDomainLiteral(string data, ref int offset, StringBuilder builder)
        {
            int startIndex = ++offset;
            StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
            while (offset < data.Length)
            {
                if (data[offset] == '\\')
                {
                    builder2.Append(data, startIndex, offset - startIndex);
                    startIndex = ++offset;
                }
                else
                {
                    if (data[offset] == ']')
                    {
                        builder2.Append(data, startIndex, offset - startIndex);
                        offset++;
                        if (builder == null)
                        {
                            return builder2.ToString();
                        }
                        return null;
                    }
                    if ((data[offset] > s_fdtext.Length) || !s_fdtext[data[offset]])
                    {
                        throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                    }
                }
                offset++;
            }
            throw new FormatException(SR.GetString("MailHeaderFieldMalformedHeader"));
        }    internal static string ReadDotAtom(string data, ref int offset, StringBuilder builder)
        {
            bool flag = true;
            if (builder == null)
            {
                flag = false;
                builder = new StringBuilder();
            }
            if (data[offset] != '.')
            {
                ReadAtom(data, ref offset, builder);
            }
            while ((offset < data.Length) && (data[offset] == '.'))
            {
                builder.Append(data[offset++]);
                ReadAtom(data, ref offset, builder);
            }
            if (flag)
            {
                return null;
            }
            return builder.ToString();
        }
      

  34.   


        internal static MailAddress ReadMailAddress(string data, ref int offset)
        {
            string encodedDisplayName = null;
            return new MailAddress(ReadMailAddress(data, ref offset, out encodedDisplayName), encodedDisplayName, 0);
        }    internal static string ReadMailAddress(string data, ref int offset, out string displayName)
        {
            string str = null;
            Exception exception = null;
            displayName = string.Empty;
            StringBuilder builder = new StringBuilder();
            try
            {
                SkipCFWS(data, ref offset);
                if (offset >= data.Length)
                {
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                    goto Label_0270;
                }
                if (data[offset] == '<')
                {
                    offset++;
                    return ReadAngleAddress(data, ref offset, builder);
                }
                ReadPhrase(data, ref offset, builder);
                if (offset >= data.Length)
                {
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                    goto Label_0270;
                }
                char ch = data[offset];
                if (ch <= '.')
                {
                    switch (ch)
                    {
                        case '"':
                            goto Label_016C;                    case '.':
                            goto Label_00D9;
                    }
                    goto Label_0211;
                }
                switch (ch)
                {
                    case ':':
                        exception = new FormatException(SR.GetString("MailAddressUnsupportedFormat"));
                        goto Label_0270;                case ';':
                        goto Label_0211;                case '<':
                        displayName = builder.ToString();
                        builder = new StringBuilder();
                        offset++;
                        str = ReadAngleAddress(data, ref offset, builder);
                        goto Label_0223;                default:
                        if (ch != '@')
                        {
                            goto Label_0211;
                        }
                        offset++;
                        str = ReadAddressSpecDomain(data, ref offset, builder);
                        goto Label_0223;
                }
            Label_00D9:
                ReadDotAtom(data, ref offset, builder);
                SkipCFWS(data, ref offset);
                if (offset >= data.Length)
                {
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                }
                else
                {
                    if (data[offset] == '@')
                    {
                        offset++;
                        str = ReadAddressSpecDomain(data, ref offset, builder);
                        goto Label_0223;
                    }
                    if (data[offset] == '<')
                    {
                        displayName = builder.ToString();
                        builder = new StringBuilder();
                        offset++;
                        str = ReadAngleAddress(data, ref offset, builder);
                        goto Label_0223;
                    }
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                }
                goto Label_0270;
            Label_016C:
                offset++;
                if (offset >= data.Length)
                {
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                    goto Label_0270;
                }
                SkipCFWS(data, ref offset);
                if (offset >= data.Length)
                {
                    exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                    goto Label_0270;
                }
                if (data[offset] == '<')
                {
                    offset++;
                    str = ReadAngleAddress(data, ref offset, builder);
                }
                else
                {
                    str = ReadAddressSpecDomain(data, ref offset, builder);
                }
                goto Label_0223;
            Label_0211:
                exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                goto Label_0270;
            Label_0223:
                if (offset < data.Length)
                {
                    SkipCFWS(data, ref offset);
                    if ((offset < data.Length) && (data[offset] != ','))
                    {
                        exception = new FormatException(SR.GetString("MailAddressInvalidFormat"));
                    }
                }
            }
            catch (FormatException)
            {
                throw new FormatException(SR.GetString("MailAddressInvalidFormat"));
            }
        Label_0270:
            if (exception != null)
            {
                throw exception;
            }
            return str;
        }
      

  35.   

        private static int ReadMonth(string data, ref int offset)
        {
            if (offset >= (data.Length - 3))
            {
                throw new FormatException(SR.GetString("MailDateInvalidFormat"));
            }
            switch (data[offset++])
            {
                case 'J':
                case 'j':
                    switch (data[offset++])
                    {
                        case 'a':
                        case 'A':
                        {
                            char ch3 = data[offset++];
                            if ((ch3 != 'N') && (ch3 != 'n'))
                            {
                                goto Label_03B2;
                            }
                            return 1;
                        }
                        case 'u':
                        case 'U':
                            switch (data[offset++])
                            {
                                case 'L':
                                case 'l':
                                    return 7;                            case 'M':
                                case 'm':
                                    goto Label_03B2;                            case 'N':
                                case 'n':
                                    return 6;
                            }
                            goto Label_03B2;
                    }
                    goto Label_03B2;            case 'K':
                case 'L':
                case 'E':
                case 'e':
                case 'k':
                case 'l':
                    goto Label_03B2;            case 'M':
                case 'm':
                {
                    char ch7 = data[offset++];
                    if ((ch7 != 'A') && (ch7 != 'a'))
                    {
                        goto Label_03B2;
                    }
                    char ch8 = data[offset++];
                    if (ch8 <= 'Y')
                    {
                        switch (ch8)
                        {
                            case 'R':
                                goto Label_021D;                        case 'Y':
                                goto Label_021B;
                        }
                        goto Label_03B2;
                    }
                    if (ch8 == 'r')
                    {
                        goto Label_021D;
                    }
                    if (ch8 != 'y')
                    {
                        goto Label_03B2;
                    }
                    goto Label_021B;
                }
                case 'N':
                case 'n':
                {
                    char ch16 = data[offset++];
                    if ((ch16 != 'O') && (ch16 != 'o'))
                    {
                        goto Label_03B2;
                    }
                    char ch17 = data[offset++];
                    if ((ch17 != 'V') && (ch17 != 'v'))
                    {
                        goto Label_03B2;
                    }
                    return 11;
                }
                case 'O':
                case 'o':
                {
                    char ch14 = data[offset++];
                    if ((ch14 != 'C') && (ch14 != 'c'))
                    {
                        goto Label_03B2;
                    }
                    char ch15 = data[offset++];
                    if ((ch15 != 'T') && (ch15 != 't'))
                    {
                        goto Label_03B2;
                    }
                    return 10;
                }
                case 'S':
                case 's':
                {
                    char ch12 = data[offset++];
                    if ((ch12 != 'E') && (ch12 != 'e'))
                    {
                        goto Label_03B2;
                    }
                    char ch13 = data[offset++];
                    if ((ch13 != 'P') && (ch13 != 'p'))
                    {
                        goto Label_03B2;
                    }
                    return 9;
                }
                case 'D':
                case 'd':
                    switch (data[offset++])
                    {
                        case 'E':
                        case 'e':
                        {
                            char ch19 = data[offset++];
                            if ((ch19 == 'C') || (ch19 == 'c'))
                            {
                                return 12;
                            }
                            break;
                        }
                    }
                    goto Label_03B2;            case 'F':
                case 'f':
                {
                    char ch5 = data[offset++];
                    if ((ch5 != 'E') && (ch5 != 'e'))
                    {
                        goto Label_03B2;
                    }
                    char ch6 = data[offset++];
                    if ((ch6 != 'B') && (ch6 != 'b'))
                    {
                        goto Label_03B2;
                    }
                    return 2;
                }
                case 'A':
                case 'a':
                    switch (data[offset++])
                    {
                        case 'p':
                        case 'P':
                        {
                            char ch10 = data[offset++];
                            if ((ch10 != 'R') && (ch10 != 'r'))
                            {
                                goto Label_03B2;
                            }
                            return 4;
                        }
                        case 'u':
                        case 'U':
                        {
                            char ch11 = data[offset++];
                            if ((ch11 != 'G') && (ch11 != 'g'))
                            {
                                goto Label_03B2;
                            }
                            return 8;
                        }
                    }
                    goto Label_03B2;
            }
            goto Label_03B2;
        Label_021B:
            return 5;
        Label_021D:
            return 3;
        Label_03B2:
            throw new FormatException(SR.GetString("MailDateInvalidFormat"));
        }    internal static string ReadParameterAttribute(string data, ref int offset, StringBuilder builder)
        {
            if (!SkipCFWS(data, ref offset))
            {
                return null;
            }
            return ReadToken(data, ref offset, null);
        }
      

  36.   

        internal static string ReadPhrase(string data, ref int offset, StringBuilder builder)
        {
            StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
            bool flag = false;
            SkipCFWS(data, ref offset);
            int num = offset;
            while (SkipCFWS(data, ref offset))
            {
                if (data[offset] == '"')
                {
                    if (flag)
                    {
                        builder2.Append(' ');
                    }
                    ReadQuotedString(data, ref offset, builder2);
                    flag = true;
                }
                else
                {
                    if (!s_atext[data[offset]])
                    {
                        break;
                    }
                    if (flag)
                    {
                        builder2.Append(' ');
                    }
                    ReadAtom(data, ref offset, builder2);
                    flag = true;
                }
            }
            if (num == offset)
            {
                throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
            }
            if (builder == null)
            {
                return builder2.ToString();
            }
            return null;
        }    internal static string ReadQuotedString(string data, ref int offset, StringBuilder builder)
        {
            return ReadQuotedString(data, ref offset, builder, false);
        }    internal static string ReadQuotedString(string data, ref int offset, StringBuilder builder, bool doesntRequireQuotes)
        {
            if (!doesntRequireQuotes)
            {
                offset++;
            }
            int startIndex = offset;
            StringBuilder builder2 = (builder != null) ? builder : new StringBuilder();
            while (offset < data.Length)
            {
                if (data[offset] == '\\')
                {
                    builder2.Append(data, startIndex, offset - startIndex);
                    startIndex = ++offset;
                }
                else
                {
                    if (data[offset] == '"')
                    {
                        builder2.Append(data, startIndex, offset - startIndex);
                        offset++;
                        if (builder == null)
                        {
                            return builder2.ToString();
                        }
                        return null;
                    }
                    if (!s_fqtext[data[offset]])
                    {
                        throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                    }
                }
                offset++;
            }
            if (!doesntRequireQuotes)
            {
                throw new FormatException(SR.GetString("MailHeaderFieldMalformedHeader"));
            }
            builder2.Append(data, startIndex, offset - startIndex);
            if (builder == null)
            {
                return builder2.ToString();
            }
            return null;
        }
      

  37.   

        internal static string ReadToken(string data, ref int offset, StringBuilder builder)
        {
            int startIndex = offset;
            while (offset < data.Length)
            {
                if (data[offset] > s_ttext.Length)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if (!s_ttext[data[offset]])
                {
                    break;
                }
                offset++;
            }
            if (startIndex == offset)
            {
                throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
            }
            return data.Substring(startIndex, offset - startIndex);
        }    internal static bool SkipCFWS(string data, ref int offset)
        {
            int num = 0;
            while (offset < data.Length)
            {
                if (data[offset] > '\x007f')
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                if ((data[offset] == '\\') && (num > 0))
                {
                    offset += 2;
                }
                else if (data[offset] == '(')
                {
                    num++;
                }
                else if (data[offset] == ')')
                {
                    num--;
                }
                else if (((data[offset] != ' ') && (data[offset] != '\t')) && (num == 0))
                {
                    return true;
                }
                if (num < 0)
                {
                    throw new FormatException(SR.GetString("MailHeaderFieldInvalidCharacter"));
                }
                offset++;
            }
            return false;
        }    internal static bool SkipFWS(string data, ref int offset)
        {
            while (offset < data.Length)
            {
                if ((data[offset] != ' ') && (data[offset] != '\t'))
                {
                    return true;
                }
                offset++;
            }
            return false;
        }    internal static void ValidateHeaderName(string data)
        {
            int num = 0;
            while (num < data.Length)
            {
                if ((data[num] > s_ftext.Length) || !s_ftext[data[num]])
                {
                    throw new FormatException(SR.GetString("InvalidHeaderName"));
                }
                num++;
            }
            if (num == 0)
            {
                throw new FormatException(SR.GetString("InvalidHeaderName"));
            }
        }
    }  
      

  38.   

    我用的都是vs中提供的正则验证控件中的email正则表达式,感觉没什么问题,挺好的
      

  39.   

    [email protected]@163.cn这种东西是绝对不可能注册成功的。