前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >验证邮件地址的Java正则表达式

验证邮件地址的Java正则表达式

作者头像
雨临Lewis
发布2022-01-11 13:53:25
6780
发布2022-01-11 13:53:25
举报
文章被收录于专栏:雨临Lewis的博客

最近写了个Java正则表达式来验证RFC 5322规范的邮件地址,这个邮件地址比较复杂,对于这样一个地址:userName@domainName,它满足以下条件:

对于userName

1、允许使用以下所有字符作为用户名: [A-Z], [a-z], [0-9], [.], [-], [_], [@], [!], [#], [$], [%], [&], ['], [*], [+], [/], [=], [?], [^], [`], [{], [|], [}], [~] 2、允许使用所有的ASCII字符,包括控制字符,前提条件是这些字符是被[\]所转义的或者被一对["]所包括起来,比如下边的格式: " [ ♥"或者\]都是合法的用户名 3、[.]不能出现在用户名的开头或者结尾,也不能连续出现两个以上的[.]

对于domainName

1、只能使用[A-Z],[a-z],[0-9],[-] 2、如果使用了[-],那么该字符不能出现在域名的开头或结尾 3、顶级域名不能全是数字 4、至少要有二级域名

Java正则表达式

由于是用来验证邮件地址的,使用的是matches()这个完全匹配的方法,并且使用非捕获组来提高性能。 写了两个正则表达式,一个是用来验证单个邮件地址的(比如xxx@xx.xx);一个是用来验证多个邮件地址的,即多个邮件地址之间用空白符或者英文的逗号或分号分割开来(比如xxx@xx.xx; xx@xxx.xxx)。

1 2 3 4 5 6 7 8 9 10 11

/** Regex format for multiple EmailValidator */ public static final String MULTIPLE_EMAIL_REGEX_FORMAT = "(?:(?:%1$s)(?:(?:\\s*,\\s*)|(?:\\s*;\\s*)|\\s*$))*"; /** Regex for single EmailValidator */ public static final String SINGLE_EMAIL_REGEX = "(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=?^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=?^`{|}~])|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+)*)@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+(?:(?:[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*)(?:[A-Za-z0-9-]*[A-Za-z0-9])?))"; public static final Pattern SINGLE_EMAIL_REGEX_PATTERN = Pattern.compile(SINGLE_EMAIL_REGEX); /** Regex for multiple EmailValidator */ public static final String MULTIPLE_EMAIL_REGEX = String.format(MULTIPLE_EMAIL_REGEX_FORMAT, SINGLE_EMAIL_REGEX); public static final Pattern MULTIPLE_EMAIL_REGEX_PATTERN = Pattern.compile(MULTIPLE_EMAIL_REGEX);

上边验证单个邮件地址的正则表达式太长了,这里分一下行:

1 2 3 4 5

public static final String SINGLE_EMAIL_REGEX = "(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=? ^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\- _@!#$%&'*+/=?^`{|}~])|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+)*) @(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+ (?:(?:[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*)(?:[A-Za-z0-9-]*[A-Za-z0-9])?))";

最后附上一些测试用的邮件地址

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

// =========TRUE EMAIL========== final String email = "Abc\\@def@example.com"; //true // final String email = "Fred\\ Bloggs@example.com"; //true // final String email = "Joe.\\\\Bloggs@example.com"; //true // final String email = "\"Abc@def\"@example.com"; //true // final String email = "\"Fred Bloggs\"@example.com"; //true // final String email = "user+mailbox@example.com"; //true // final String email = "customer/department=shipping@example.com"; //true // final String email = "$A12345@example.com"; //true // final String email = "!def!xyz%abc@example.com"; //true // final String email = "_somename@example.com"; //true // final String email = "Natasha.O'neill@thewarehouse.com"; //true // final String email = "ab.c@exam-ple.c--om"; // true // final String email = "------ab.c@example.12.com"; // true // final String email = "------ab.c@example.12.com "; // true // ==========FALSE EMAIL========== // final String email = "abc[@example.com"; //false // final String email = ".abc@example.com"; //false // final String email = "ab..c@example.com"; // false // final String email = "ab.c@example.com."; // false // final String email = "ab.c@example.com-"; // false // final String email = "------ab.c.@example.com"; // false // final String email = "------ab.c@-example-.com"; // false // final String email = "------ab.c@com"; // false // final String email = "------ab.c@example.12"; // false

警告

本文最后更新于 April 3, 2018,文中内容可能已过时,请谨慎使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-032,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对于userName
  • 对于domainName
  • Java正则表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档