C#Email Regular Expression – 符合RFC 2822指南的任何内容吗?

我意识到有大量的正则表达式电子邮件validation,但我似乎找不到符合RFC 2822标准的电子邮件validation。

我找到的那些继续让垃圾像… @ abc.com通过。

如果其中一个问题的答案已经符合RFC 2822(但没有注释,那么请原谅),请原谅我。

不久之前,我做了一个post 。 是的,可以使用.NET正则表达式,因为它们具有称为“ 平衡组 ”的非常规function。

经常发布的Perl RFC822与电子邮件地址不完全匹配,因为它需要预处理来删除注释。 这也是一个非常古老的RFC(从1982年开始!)。

此正则表达式适用于RFC5322,这是最新的。 它还可以正确处理所有注释和折叠空白。

这是正则表达式:

 ^(?'localPart'((((\((((?'paren'\()|(?'-paren'\))|([\u0021-\u 0027\u002a-\u005b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u 000e-\u001f\u007f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)| \\([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c \u000e-\u001f\u007f]))*(?(paren)(?!)))\))|([ \t]+((\r\n)[ \t ]+)?|((\r\n)[ \t]+)+))*?(([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)|( "(([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)?(([\u0021\u0023-\u 005b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u 007f])|\\([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000 b\u000c\u000e-\u001f\u007f])))*([ \t]+((\r\n)[ \t]+)?|((\r\n )[ \t]+)+)?"))((\((((?'paren'\()|(?'-paren'\))|([\u0021-\u00 27\u002a-\u005b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u00 0e-\u001f\u007f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\ ([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u 000e-\u001f\u007f]))*(?(paren)(?!)))\))|([ \t]+((\r\n)[ \t]+ )?|((\r\n)[ \t]+)+))*?)(\.(((\((((?'paren'\()|(?'-paren'\))| ([\u0021-\u0027\u002a-\u005b\u005d-\u007e]|[\u0001-\u0008\u0 00b\u000c\u000e-\u001f\u007f])|([ \t]+((\r\n)[ \t]+)?|((\r\n )[ \t]+)+)|\\([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\ u000b\u000c\u000e-\u001f\u007f]))*(?(paren)(?!)))\))|([ \t]+ ((\r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?(([a-zA-Z0-9!#$%&'*+/=?^_ `{|}~-]+)|("(([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)?(([\u00 21\u0023-\u005b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u00 0e-\u001f\u007f])|\\([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001- \u0008\u000b\u000c\u000e-\u001f\u007f])))*([ \t]+((\r\n)[ \t ]+)?|((\r\n)[ \t]+)+)?"))((\((((?'paren'\()|(?'-paren'\))|([ \u0021-\u0027\u002a-\u005b\u005d-\u007e]|[\u0001-\u0008\u000 b\u000c\u000e-\u001f\u007f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u0 00b\u000c\u000e-\u001f\u007f]))*(?(paren)(?!)))\))|([ \t]+(( \r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?))*))@(?'domain'((((\((((?' paren'\()|(?'-paren'\))|([\u0021-\u0027\u002a-\u005b\u005d-\ u007e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f])|([ \t ]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u007e]|[ \t]| [\r\n\0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f]))*(? (paren)(?!)))\))|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?( ([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)|("(([ \t]+((\r\n)[ \t]+)?| ((\r\n)[ \t]+)+)?(([\u0021\u0023-\u005b\u005d-\u007e]|[\u000 1-\u0008\u000b\u000c\u000e-\u001f\u007f])|\\([\u0021-\u007e] |[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007 f])))*([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)?"))((\((((?'pa ren'\()|(?'-paren'\))|([\u0021-\u0027\u002a-\u005b\u005d-\u0 07e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f])|([ \t]+ ((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u007e]|[ \t]|[\ r\n\0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f]))*(?(p aren)(?!)))\))|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?)(\ .(((\((((?'paren'\()|(?'-paren'\))|([\u0021-\u0027\u002a-\u0 05b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u0 07f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u0 07e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\ u007f]))*(?(paren)(?!)))\))|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?(([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)|("(([ \t]+((\r\ n)[ \t]+)?|((\r\n)[ \t]+)+)?(([\u0021\u0023-\u005b\u005d-\u0 07e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f])|\\([\u0 021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u000e- \u001f\u007f])))*([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)?")) ((\((((?'paren'\()|(?'-paren'\))|([\u0021-\u0027\u002a-\u005 b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007 f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u007 e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u0 07f]))*(?(paren)(?!)))\))|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t ]+)+))*?))*)|(((\((((?'paren'\()|(?'-paren'\))|([\u0021-\u00 27\u002a-\u005b\u005d-\u007e]|[\u0001-\u0008\u000b\u000c\u00 0e-\u001f\u007f])|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\ ([\u0021-\u007e]|[ \t]|[\r\n\0]|[\u0001-\u0008\u000b\u000c\u 000e-\u001f\u007f]))*(?(paren)(?!)))\))|([ \t]+((\r\n)[ \t]+ )?|((\r\n)[ \t]+)+))*?\[(([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t] +)+)?([!-Z^-~]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f ]))*([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+)?\]((\((((?'paren '\()|(?'-paren'\))|([\u0021-\u0027\u002a-\u005b\u005d-\u007e ]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f])|([ \t]+((\ r\n)[ \t]+)?|((\r\n)[ \t]+)+)|\\([\u0021-\u007e]|[ \t]|[\r\n \0]|[\u0001-\u0008\u000b\u000c\u000e-\u001f\u007f]))*(?(pare n)(?!)))\))|([ \t]+((\r\n)[ \t]+)?|((\r\n)[ \t]+)+))*?))\z 

但是有些警告。 RFC5322的域名比实际域RFC更自由,并且还有其他限制适用于各种RFC,例如实际的SMTP RFC本身(指定最大长度)。 因此,即使根据5322电子邮件是正确的,它也可以通过各种其他措施无效。

黄金测试仍然是使用validation码向该地址发送电子邮件。

这适用于RFC822 ,而不适用于较新的RFC822 。 但似乎地址格式没有改变 ,所以应该是你正在寻找的。

(注意正则表达式下面的注释 – 它仍假定地址已被预处理)

这在PCRE中运行: http : //code.iamcal.com/php/rfc822/full_regexp.txt

显然是32k。

说真的 – 可以考虑使用单个正则表达式退出,或者接受所有可能的电子邮件表单。

我会看一下: http : //www.regular-expressions.info/email.html ,它解释了很多关于使用正则表达式来匹配电子邮件地址的内容,并且包含了一个完整的RFC 2822表达式,老实说,我几乎从不推荐使用它。