我已经编写了下面的正则表达式来进行非常简单的电子邮件验证。我打算发送确认链接。
/.*@[a-z0-9.-]*/i
但是,我希望从当前状态增强它,因为像这样的字符串不能产生预期的结果:
test,my.name + test @ gmail-something.co.uk,test
“测试”部分不合需要地包括在匹配中。我没有成功地尝试过单词边界。
谢谢!
答案 0 :(得分:15)
这是 很多 更复杂!!! 见Mail::RFC822::Address并且害怕......非常害怕。
答案 1 :(得分:14)
不要使用正则表达式来验证电子邮件地址
相反,来自Ben Finney撰写的mail.python.org/pipermail/python-list 1 。
当人们问“我如何验证是否有问题时,我看到的最佳建议” 电子邮件地址有效吗?“是”尝试向其发送邮件“。
它既是Pythonic,也是真正最好的方式。如果你真的想 确认,不要试图静态验证它; 使用电子邮件地址, 并检查结果。发送电子邮件到该地址,不要使用它 除非你得到答复说“是的,这是正确的。” 地址使用“来自收件人。
发送系统的邮件传输代理,而不是正则表达式, 确定将邮件发送到的域是哪个部分。
域名系统,而不是正则表达式,决定了什么 域名有效,主机应该接收该域名的邮件。
最特别的是接收邮件系统,而不是正则表达式, 确定哪些本地部分有效。
答案 2 :(得分:6)
几乎没有任何你使用的东西是短暂的,因为看起来很有意义,TRULY会验证一个电子邮件地址。话虽如此,这是我通常使用的:
^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
它实际上是ASP.NET的电子邮件地址的正则表达式验证器的内置正则表达式。
注意:此线程中给出的许多正则表达式可能在90年代有效,但在当今的Web环境中,TLD允许少于2个字符且超过4个字符。例如,info @about.museum是一个有效的电子邮件地址,因为.museum是新的长TLD之一。
答案 3 :(得分:3)
我发现不是将整个电子邮件地址与正则表达式匹配,而是将字符串拆分为@和:
更为实际。进行DNS检查的原因是,无法访问的电子邮件地址虽然符合RFC标准,但却毫无价值。另外检查A记录的原因是它们用于确定在没有找到MX记录时将邮件发送到何处。 (见RFC2821,3.6)
进一步提示:
答案 4 :(得分:1)
/[^\s]*@[a-z0-9.-]*/i
答案 5 :(得分:0)
这来自Regex Buddy(绝对需要购买编程!)
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b
答案 6 :(得分:-1)
较小的两步正则表达式提供了良好的结果
/ **检查电子邮件地址是否有效格式。
*邮箱的主要特征必须是alpha
*剩余字符字母数字加-_和点
*域名必须至少为2个字符
*域名扩展名必须至少为2,不超过4 alpha
*允许子域名。
* @version 050208将撇号添加为有效字符
* @version 04/25/07单个字母的电子邮件地址和单个
*允许使用字母域名。
* /
public static boolean isValidEmailAddress(String address){
String sRegExp;
// 050208 using the literal that was actually in place
// 050719 tweaked
// 050907 tweaked, for spaces next to @ sign, two letter email left of @ ok
// 042507 changed to allow single letter email addresses and single letter domain names
// 080612 added trap and unit test for two adjacent @signs
sRegExp = "[a-z0-9#$%&]" // don't lead with dot
+ "[a-z0-9#$%&'\\.\\-_]*" // more stuff dots OK
+ "@[^\\.\\s@]" // no dots or space or another @ sign next to @ sign
+ "[a-z0-9_\\.\\-_]*" // may or may not have more character
+ "\\.[a-z]{2,4}"; // ending with top level domain: com,. biz, .de, etc.
boolean bTestOne = java.util.regex.Pattern.compile( sRegExp,
java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).matches();
// should this work ?
boolean bTwoDots = java.util.regex.Pattern.compile("\\.\\.", // no adjacent dots
java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find();
boolean bDotBefore = java.util.regex.Pattern.compile("[\\.\\s]@", //no dots or spaces before @
java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find();
return bTestOne && !bTwoDots && !bDotBefore;
} // end IsValidEmail