验证电子邮件不是一个选项:(
我需要使用一组非常具体的规则来验证电子邮件地址。我尝试过 Apache Commons 库以及 JavaMail 库;尽管两者都遵守 RFC 2822,但根据我的规则,一些无效的电子邮件仍然可以通过。我一直在尝试使用正则表达式(regex?),但没有成功。我知道我知道。正则表达式不是最好的选择,可能会花费大量时间并增加复杂性。尽管如此,我认为既然我用不太困难的术语概述了规则,那么为这个特定实例构建一个规则就足够了。
规则:
- 电子邮件地址的本地部分可以使用以下任意一项:
- 大小写字母
- 数字 0-9
- 特殊字符: , ! # $ % ^ & * ( ) ' ` + = - _ { } | 〜
- 句点,但不能以句点开头或结尾
- 不得包含连续的句点
- 电子邮件的本地部分和域部分之间必须有一个 At 符号 (@)
- 域名只能包含字母、数字、下划线、句点和连字符
- 不能以连字符开头
- 不能以连字符结尾
- 不能包含两个连续的连字符
- 电子邮件的域名和 TLD 部分之间必须有句点
- TLD 只能包含字母
- TLD 不得以句点结尾
到目前为止,我一直在尝试使用以下正则表达式:
<删除> ^((?!.\.{2,}.)[^.][-a-zA-Z0-9_.\!\@\#\$\%\^\&\*\(\)\,\'\+\=\`\{\|\}\~\-]+[^.])@((?!.\-{2,}.)[^-_][-a-zA- Z0-9_.]+[^-_]\.[a-zA-z]+)$^((?!.\.{2,}.)[^.][-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+[^.])@((?!.\-{2,}.)[^-_][-a-zA-Z0-9_.]+[^-_]\.[a-zA-z]+)$
由于电子邮件无效(例如 juSTLikethat@gm--ail.com),这仍然失败。
我在正则表达式中遗漏了什么或做错了什么?有没有其他方法可以确保电子邮件符合要求而无需正则表达式?
提前致谢!
附注这是在 Java 中,因此上述正则表达式中的所有转义字符都必须进行双重转义(例如 \.
是 \\.
)。我也一直在使用Regexper帮助我想象这一点,因为我显然不是正则表达式专家。
最佳答案
我建议:
拆分@
象征。在最后一个周期上拆分(使用 String#substring
和 String#lastIndexOf
)。现在您已将本地部分、域和 TLD 全部放在单独的字符串中,使用 if 语句进行验证。如果有任何规则适用于所有(2 个连续周期?),请在拆分之前执行此操作。更容易正确操作、更容易理解、更容易维护。
但是,如果您真的想坚持使用正则表达式,这里有一些我看到的东西:
[^.]
之前@
应该是(?<!\.)
,否则为 @
之前的最后一个字符可以是任何东西。
.
只是一个字符,所以 (?!.\-{2,}.)
和(?!.\.{2,}.)
不做你认为它做的事。刚刚成功.*
似乎可以修复它。而且您不需要在您要查找的内容之后检查任何字符。
尚未明确说明,但我认为域名和 TLD 也不能包含 2 个连续的句点。如果允许,则正则表达式的第一部分需要是 (?!.*\.{2,}.*@)
停在 @
.
如果您使用 String#matches
,^
和$
不是必需的。
有一些不需要的()
的。
最终正则表达式:
(?!.*\.{2,})[^.][-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+(?<!\.)@(?!.*\-{2,})[^-_][-a-zA-Z0-9_.]+[^-_]\.[a-zA-z]+
如果您选择坚持使用正则表达式,我建议进行广泛的评论:
String regex =
"(?!.*\\.{2,})" // doesn't contain 2 consecutive .'s
// local part
+ "[^.]" // doesn't start with a .
+ "[-a-zA-Z0-9_.!@#$%^&*(),'+=`{|}~-]+" // valid chars for local part
+ "(?<!\\.)" // last char of local part isn't a .
// at symbol
+ "@"
// domain
...
这可能看起来有点矫枉过正,但如果您尝试在几个月后维护它,您会希望自己拥有它,特别是如果您在那几个月没有接触过任何正则表达式的话。
关于java - 验证电子邮件(不发送确认),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700394/