如何使正则表达式在角落案例电子邮件地址上工作

可能重复:
电子邮件验证 - 正则表达式
验证电子邮件地址的最佳正则表达式是什么?

大家好,

我有一个大致像这样的电子邮件地址,

firstname.lastname@4domain.co.nz

这不适用于我在这里用于电子邮件地址的正则表达式。 它似乎并不喜欢域名开头的4。

private const string MatchEmailPattern =
        @"^(([w-]+.)+[w-]+|([a-zA-Z]{1}|[w-]{2,}))@" +
        @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9]).([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])." +
        @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9]).([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|" +
        @"([a-zA-Z]+[w-]+.)+[a-zA-Z]{2,4})$";

大多数其他角落案件与这个正则表达式很好,下面的所有被拒绝,

        Assert.IsFalse(EmailValidator.IsValidEmailAddress("..@test.com"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress(".a@test.com"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress(".@s.dd"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("ab@988.120.150.10"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("ab@120.256.256.120"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("2@bde.cc"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("-@bde.cc"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("..@bde.cc"));
        Assert.IsFalse(EmailValidator.IsValidEmailAddress("_@bde.cc"));

任何其他正则表达式的人可以建议的电子邮件,将与上述工作?

另外上面的正则表达式的优点是它可以处理像这样的地址,而且它们中的很多不这样做,

firstname.lastname_@gmail.com


您应该使用MailAddress类,如下所示:

try {
    address = new MailAddress(address).Address;
} catch(FormatException) {
    //address is invalid
}

说实话? 我可能不会这么说,但为什么不能匹配

.+@.+

极简主义但90%的情况下功能。


一个有趣的事实是(与大多数语言不同),可以在C#/ .NET中编写一个完全符合RFC5322规范的电子邮件地址的“正则表达式”。 这是我之前准备的一个(链接显示了建筑):

^(?'localPart'((((((((?'paren'()|(?'-paren'))|([u0021-u0027u002a
-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u001fu007f])|
([ t]+((rn)[ t]+)?|((rn)[ t]+)+)|([u0021-u007e]|[ t]|[rn
]|[u0001-u0008u000bu000cu000e-u001fu007f]))*(?(paren)(?!))))
)|([ t]+((rn)[ t]+)?|((rn)[ t]+)+))*?(([a-zA-Z0-9!#$%&'*+/=?^_`
{|}~-]+)|("(([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?(([u0021u0023-u
005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u001fu007f])|(
[u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000cu000e-u001f
u007f])))*([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?"))((((((?'paren'
()|(?'-paren'))|([u0021-u0027u002a-u005bu005d-u007e]|[u0001-u
0008u000bu000cu000e-u001fu007f])|([ t]+((rn)[ t]+)?|((rn)[ 
t]+)+)|([u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000cu
000e-u001fu007f]))*(?(paren)(?!)))))|([ t]+((rn)[ t]+)?|((rn)
[ t]+)+))*?)(.(((((((?'paren'()|(?'-paren'))|([u0021-u0027u002
a-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u001fu007f])
|([ t]+((rn)[ t]+)?|((rn)[ t]+)+)|([u0021-u007e]|[ t]|[r
n]|[u0001-u0008u000bu000cu000e-u001fu007f]))*(?(paren)(?!)))
))|([ t]+((rn)[ t]+)?|((rn)[ t]+)+))*?(([a-zA-Z0-9!#$%&'*+/=?^_
`{|}~-]+)|("(([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?(([u0021u0023-
u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u001fu007f])|
([u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000cu000e-u001
fu007f])))*([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?"))((((((?'paren'
()|(?'-paren'))|([u0021-u0027u002a-u005bu005d-u007e]|[u0001-
u0008u000bu000cu000e-u001fu007f])|([ t]+((rn)[ t]+)?|((rn)[
t]+)+)|([u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000cu
000e-u001fu007f]))*(?(paren)(?!)))))|([ t]+((rn)[ t]+)?|((rn)
[ t]+)+))*?))*))@(?'domain'((((((((?'paren'()|(?'-paren'))|([u002
1-u0027u002a-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-
u001fu007f])|([ t]+((rn)[ t]+)?|((rn)[ t]+)+)|([u0021-u007
e]|[ t]|[rn]|[u0001-u0008u000bu000cu000e-u001fu007f]))*(?(
paren)(?!)))))|([ t]+((rn)[ t]+)?|((rn)[ t]+)+))*?(([a-zA-Z0-9
!#$%&'*+/=?^_`{|}~-]+)|("(([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?(([
u0021u0023-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u00
1fu007f])|([u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000
cu000e-u001fu007f])))*([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?"))((
((((?'paren'()|(?'-paren'))|([u0021-u0027u002a-u005bu005d-u00
7e]|[u0001-u0008u000bu000cu000e-u001fu007f])|([ t]+((rn)[ t
]+)?|((rn)[ t]+)+)|([u0021-u007e]|[ t]|[rn]|[u0001-u0008
u000bu000cu000e-u001fu007f]))*(?(paren)(?!)))))|([ t]+((rn)[ 
t]+)?|((rn)[ t]+)+))*?)(.(((((((?'paren'()|(?'-paren'))|([u00
21-u0027u002a-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-
u001fu007f])|([ t]+((rn)[ t]+)?|((rn)[ t]+)+)|([u0021-u00
7e]|[ t]|[rn]|[u0001-u0008u000bu000cu000e-u001fu007f]))*(?
(paren)(?!)))))|([ t]+((rn)[ t]+)?|((rn)[t]+)+))*?(([a-zA-Z0-9
!#$%&'*+/=?^_`{|}~-]+)|("(([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?(([
u0021u0023-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e-u00
1fu007f])|([u0021-u007e]|[ t]|[rn]|[u0001-u0008u000bu000
cu000e-u001fu007f])))*([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?"))((
((((?'paren'()|(?'-paren'))|([u0021-u0027u002a-u005bu005d-u00
7e]|[u0001-u0008u000bu000cu000e-u001fu007f])|([ t]+((rn)[ t
]+)?|((rn)[ t]+)+)|([u0021-u007e]|[ t]|[rn]|[u0001-u0008
u000bu000cu000e-u001fu007f]))*(?(paren)(?!)))))|([ t]+((rn)[ 
t]+)?|((rn)[ t]+)+))*?))*)|(((((((?'paren'()|(?'-paren'))|([u0
021-u0027u002a-u005bu005d-u007e]|[u0001-u0008u000bu000cu000e
-u001fu007f])|([ t]+((rn)[ t]+)?|((rn)[ t]+)+)|([u0021-u0
07e]|[ t]|[rn]|[u0001-u0008u000bu000cu000e-u001fu007f]))*(
?(paren)(?!)))))|([ t]+((rn)[ t]+)?|((rn)[ t]+)+))*?[(([ t]+
((rn)[ t]+)?|((rn)[ t]+)+)?([!-Z^-~]|[u0001-u0008u000bu000c
u000e-u001fu007f]))*([ t]+((rn)[ t]+)?|((rn)[ t]+)+)?](((((
(?'paren'()|(?'-paren'))|([u0021-u0027u002a-u005bu005d-u007e]|
[u0001-u0008u000bu000cu000e-u001fu007f])|([ t]+((rn)[ t]+)?
|((rn)[ t]+)+)|([u0021-u007e]|[ t]|[rn]|[u0001-u0008u00
0bu000cu000e-u001fu007f]))*(?(paren)(?!)))))|([ t]+((rn)[ t]+
)?|((rn)[ t]+)+))*?))$

但是请注意,RFC5322的域名处理比实际的域名RFC更加宽松,并且还存在其他限制,这些限制适用于各种RFC(例如,SMTP强制实施最大长度)。 因此,RFC5322考虑电子邮件地址的事情仍然可以通过其他措施无效。

酸性测试仍然只是:用验证码发送电子邮件给它。

链接地址: http://www.djcxy.com/p/2701.html

上一篇: How to make regex work on corner case email address

下一篇: How to `git clone` including submodules?