2013-11-20 43 views
1

我与ASP.NET MVC 3 C#工作,我有这样的正则表达式:正则表达式电子邮件与2个字符后,@

@“([A-ZA-Z0-9%._-] + “[a-zA-Z0-9 .-] +。[a-zA-Z] {2,4})+”

它适用于几乎所有情况,除非@小于2字符。

例如: [email protected] <有效的电子邮件。
[email protected] <无效的电子邮件,但我的正则表达式不起作用。

我在论坛上找不到像这样的东西,我对正则表达式几乎一无所知。 有人可以帮忙吗?谢谢。 (对不起,英文不好)。

+0

http://www.regular-expressions.info/email.html – Bas

+2

单字母域存在:http://en.wikipedia.org/wiki/Single-letter_second-level_domain – Paddy

+0

这也失败了堆栈+溢出@ example.com' –

回答

0

由于这是C#你总是可以创建自己的属性,使这个看起来更吸引人一些。

using System.ComponentModel.DataAnnotations; 
class EmailValidationAttribute : RegularExpressionAttribute 
{ 
    public EmailValidationAttribute() 
     : base("^[a-zA-Z0-9_\\+-]+(\\.[a-zA-Z0-9_\\+-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.([a-zA-Z]{2,4})$") { } 
} 


class EmailTest 
{ 
    [EmailValidation(ErrorMessage="Please Enter a valid email address")] 
    public String Email { get; set; } 

} 

这应该考虑到大多数情况下,你可以随时还与罗伯特·普的回答结合起来,以获得更好的正则表达式,但我可以看到它并没有考虑到人写他们的电子邮件中的大写字母。

3

您不会在RegExp中跳过句点(。),因此它们基本上是任何字符占位符。

电子邮件地址的域名部分(@后面)只能包含字母,数字,句点和连字符。第一个和最后一个字符以及一段时间前后的字符必须是字母或数字。 这可能因为新的外部字符而有所改变。

+1

如果你仍然问为什么[email protected]失败,解释如下...正则表达式匹配4个最后的字符地址(即“.com”),因为您的模式结尾处的范围为2-4个字符,而模式中的最后一个点与“a”匹配,因此“+”模式无法找到并且它至少需要一个字符,所以模式无法匹配。 – Les

1

http://www.regular-expressions.info/email.html

RFC 5322:

(?:[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])+) 
    \])